vestberry-cli 0.1.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/LICENSE +21 -0
- package/README.md +186 -0
- package/dist/api/client.d.ts +8 -0
- package/dist/api/client.js +57 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/endpoints/auth.d.ts +6 -0
- package/dist/api/endpoints/auth.js +9 -0
- package/dist/api/endpoints/auth.js.map +1 -0
- package/dist/api/endpoints/companies.d.ts +8 -0
- package/dist/api/endpoints/companies.js +34 -0
- package/dist/api/endpoints/companies.js.map +1 -0
- package/dist/api/endpoints/funds.d.ts +10 -0
- package/dist/api/endpoints/funds.js +293 -0
- package/dist/api/endpoints/funds.js.map +1 -0
- package/dist/api/endpoints/meta.d.ts +4 -0
- package/dist/api/endpoints/meta.js +48 -0
- package/dist/api/endpoints/meta.js.map +1 -0
- package/dist/api/endpoints/metrics.d.ts +33 -0
- package/dist/api/endpoints/metrics.js +306 -0
- package/dist/api/endpoints/metrics.js.map +1 -0
- package/dist/api/endpoints/notes.d.ts +10 -0
- package/dist/api/endpoints/notes.js +63 -0
- package/dist/api/endpoints/notes.js.map +1 -0
- package/dist/api/endpoints/portco-dashboard.d.ts +6 -0
- package/dist/api/endpoints/portco-dashboard.js +123 -0
- package/dist/api/endpoints/portco-dashboard.js.map +1 -0
- package/dist/api/endpoints/raw.d.ts +3 -0
- package/dist/api/endpoints/raw.js +22 -0
- package/dist/api/endpoints/raw.js.map +1 -0
- package/dist/api/endpoints/reports.d.ts +5 -0
- package/dist/api/endpoints/reports.js +104 -0
- package/dist/api/endpoints/reports.js.map +1 -0
- package/dist/api/graphql.d.ts +7 -0
- package/dist/api/graphql.js +32 -0
- package/dist/api/graphql.js.map +1 -0
- package/dist/api/introspection.d.ts +2 -0
- package/dist/api/introspection.js +62 -0
- package/dist/api/introspection.js.map +1 -0
- package/dist/api/types.d.ts +32 -0
- package/dist/api/types.js +18 -0
- package/dist/api/types.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +57 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/auth.d.ts +2 -0
- package/dist/commands/auth.js +27 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/captable-event.d.ts +2 -0
- package/dist/commands/captable-event.js +31 -0
- package/dist/commands/captable-event.js.map +1 -0
- package/dist/commands/common.d.ts +17 -0
- package/dist/commands/common.js +46 -0
- package/dist/commands/common.js.map +1 -0
- package/dist/commands/fund.d.ts +2 -0
- package/dist/commands/fund.js +87 -0
- package/dist/commands/fund.js.map +1 -0
- package/dist/commands/intent/index.d.ts +2 -0
- package/dist/commands/intent/index.js +286 -0
- package/dist/commands/intent/index.js.map +1 -0
- package/dist/commands/investment.d.ts +2 -0
- package/dist/commands/investment.js +51 -0
- package/dist/commands/investment.js.map +1 -0
- package/dist/commands/kpi.d.ts +2 -0
- package/dist/commands/kpi.js +113 -0
- package/dist/commands/kpi.js.map +1 -0
- package/dist/commands/meta.d.ts +2 -0
- package/dist/commands/meta.js +64 -0
- package/dist/commands/meta.js.map +1 -0
- package/dist/commands/note.d.ts +2 -0
- package/dist/commands/note.js +113 -0
- package/dist/commands/note.js.map +1 -0
- package/dist/commands/portco.d.ts +2 -0
- package/dist/commands/portco.js +26 -0
- package/dist/commands/portco.js.map +1 -0
- package/dist/commands/portfolio-company.d.ts +2 -0
- package/dist/commands/portfolio-company.js +48 -0
- package/dist/commands/portfolio-company.js.map +1 -0
- package/dist/commands/portfolio-summary.d.ts +18 -0
- package/dist/commands/portfolio-summary.js +334 -0
- package/dist/commands/portfolio-summary.js.map +1 -0
- package/dist/commands/raw.d.ts +2 -0
- package/dist/commands/raw.js +57 -0
- package/dist/commands/raw.js.map +1 -0
- package/dist/commands/round.d.ts +2 -0
- package/dist/commands/round.js +68 -0
- package/dist/commands/round.js.map +1 -0
- package/dist/commands/schema.d.ts +2 -0
- package/dist/commands/schema.js +27 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/stakeholder.d.ts +2 -0
- package/dist/commands/stakeholder.js +50 -0
- package/dist/commands/stakeholder.js.map +1 -0
- package/dist/formatters/csv.d.ts +1 -0
- package/dist/formatters/csv.js +16 -0
- package/dist/formatters/csv.js.map +1 -0
- package/dist/formatters/json.d.ts +1 -0
- package/dist/formatters/json.js +7 -0
- package/dist/formatters/json.js.map +1 -0
- package/dist/formatters/table.d.ts +1 -0
- package/dist/formatters/table.js +31 -0
- package/dist/formatters/table.js.map +1 -0
- package/dist/resolvers/company.d.ts +7 -0
- package/dist/resolvers/company.js +22 -0
- package/dist/resolvers/company.js.map +1 -0
- package/dist/resolvers/fund.d.ts +7 -0
- package/dist/resolvers/fund.js +22 -0
- package/dist/resolvers/fund.js.map +1 -0
- package/dist/resolvers/round.d.ts +8 -0
- package/dist/resolvers/round.js +25 -0
- package/dist/resolvers/round.js.map +1 -0
- package/dist/resolvers/search.d.ts +6 -0
- package/dist/resolvers/search.js +57 -0
- package/dist/resolvers/search.js.map +1 -0
- package/dist/resolvers/stakeholder.d.ts +7 -0
- package/dist/resolvers/stakeholder.js +22 -0
- package/dist/resolvers/stakeholder.js.map +1 -0
- package/dist/utils/cache.d.ts +7 -0
- package/dist/utils/cache.js +18 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/config.d.ts +16 -0
- package/dist/utils/config.js +25 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/errors.d.ts +12 -0
- package/dist/utils/errors.js +24 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/flatten.d.ts +3 -0
- package/dist/utils/flatten.js +77 -0
- package/dist/utils/flatten.js.map +1 -0
- package/dist/utils/json-export.d.ts +10 -0
- package/dist/utils/json-export.js +53 -0
- package/dist/utils/json-export.js.map +1 -0
- package/dist/utils/output.d.ts +4 -0
- package/dist/utils/output.js +63 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/pagination.d.ts +12 -0
- package/dist/utils/pagination.js +46 -0
- package/dist/utils/pagination.js.map +1 -0
- package/dist/utils/parse-json.d.ts +2 -0
- package/dist/utils/parse-json.js +34 -0
- package/dist/utils/parse-json.js.map +1 -0
- package/dist/utils/portfolio-overview.d.ts +25 -0
- package/dist/utils/portfolio-overview.js +115 -0
- package/dist/utils/portfolio-overview.js.map +1 -0
- package/dist/utils/run-log.d.ts +1 -0
- package/dist/utils/run-log.js +17 -0
- package/dist/utils/run-log.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.compactObject = compactObject;
|
|
4
|
+
exports.flattenRow = flattenRow;
|
|
5
|
+
exports.compactRows = compactRows;
|
|
6
|
+
const HIDDEN_PREFIXES = ['test_', 'internal_'];
|
|
7
|
+
function shouldHideKey(key) {
|
|
8
|
+
if (key === '__typename') {
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
return HIDDEN_PREFIXES.some((prefix) => key.startsWith(prefix));
|
|
12
|
+
}
|
|
13
|
+
function simplifyValue(value) {
|
|
14
|
+
if (value === null || value === undefined) {
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
if (Array.isArray(value)) {
|
|
18
|
+
return value.map((item) => simplifyValue(item));
|
|
19
|
+
}
|
|
20
|
+
if (typeof value !== 'object') {
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
const obj = value;
|
|
24
|
+
if ('displayName' in obj && typeof obj.displayName === 'string') {
|
|
25
|
+
return obj.displayName;
|
|
26
|
+
}
|
|
27
|
+
if ('name' in obj && typeof obj.name === 'string') {
|
|
28
|
+
return obj.name;
|
|
29
|
+
}
|
|
30
|
+
if ('code' in obj && typeof obj.code === 'string') {
|
|
31
|
+
return obj.code;
|
|
32
|
+
}
|
|
33
|
+
if ('id' in obj && typeof obj.id === 'string' && Object.keys(obj).length === 1) {
|
|
34
|
+
return obj.id;
|
|
35
|
+
}
|
|
36
|
+
return compactObject(obj);
|
|
37
|
+
}
|
|
38
|
+
function compactObject(input) {
|
|
39
|
+
const out = {};
|
|
40
|
+
for (const [key, value] of Object.entries(input)) {
|
|
41
|
+
if (shouldHideKey(key)) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
out[key] = simplifyValue(value);
|
|
45
|
+
}
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
function flattenRow(input, prefix = '') {
|
|
49
|
+
const out = {};
|
|
50
|
+
for (const [key, value] of Object.entries(input)) {
|
|
51
|
+
const composed = prefix ? `${prefix}.${key}` : key;
|
|
52
|
+
if (value === null || value === undefined) {
|
|
53
|
+
out[composed] = value;
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (Array.isArray(value)) {
|
|
57
|
+
if (value.length > 0 && typeof value[0] === 'object') {
|
|
58
|
+
out[composed] = JSON.stringify(value);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
out[composed] = value.join(', ');
|
|
62
|
+
}
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
if (typeof value === 'object') {
|
|
66
|
+
const nested = flattenRow(value, composed);
|
|
67
|
+
Object.assign(out, nested);
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
out[composed] = value;
|
|
71
|
+
}
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
function compactRows(rows) {
|
|
75
|
+
return rows.map((row) => compactObject(row));
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=flatten.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flatten.js","sourceRoot":"","sources":["../../src/utils/flatten.ts"],"names":[],"mappings":";;AAuCA,sCAYC;AAED,gCA8BC;AAED,kCAEC;AAvFD,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAE/C,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,IAAI,aAAa,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QAChE,OAAO,GAAG,CAAC,WAAW,CAAC;IACzB,CAAC;IACD,IAAI,MAAM,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAClD,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IACD,IAAI,MAAM,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAClD,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IACD,IAAI,IAAI,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/E,OAAO,GAAG,CAAC,EAAE,CAAC;IAChB,CAAC;IAED,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,SAAgB,aAAa,CAAC,KAA8B;IAC1D,MAAM,GAAG,GAA4B,EAAE,CAAC;IAExC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,SAAS;QACX,CAAC;QAED,GAAG,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAgB,UAAU,CAAC,KAA8B,EAAE,MAAM,GAAG,EAAE;IACpE,MAAM,GAAG,GAA4B,EAAE,CAAC;IAExC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QAEnD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC1C,GAAG,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;YACtB,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACrD,GAAG,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,UAAU,CAAC,KAAgC,EAAE,QAAQ,CAAC,CAAC;YACtE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,GAAG,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAgB,WAAW,CAAC,IAAoC;IAC9D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function createTimestampPrefix(now?: Date): string;
|
|
2
|
+
export declare function buildDefaultJsonExportPath(options: {
|
|
3
|
+
type: string;
|
|
4
|
+
idLabel: string;
|
|
5
|
+
id: string;
|
|
6
|
+
now?: Date;
|
|
7
|
+
baseDir?: string;
|
|
8
|
+
}): string;
|
|
9
|
+
export declare function resolveJsonExportPath(requestedPath: string | undefined, defaultPath: string): Promise<string>;
|
|
10
|
+
export declare function writeJsonExportFile(filePath: string, payload: unknown): Promise<void>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createTimestampPrefix = createTimestampPrefix;
|
|
7
|
+
exports.buildDefaultJsonExportPath = buildDefaultJsonExportPath;
|
|
8
|
+
exports.resolveJsonExportPath = resolveJsonExportPath;
|
|
9
|
+
exports.writeJsonExportFile = writeJsonExportFile;
|
|
10
|
+
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
11
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
12
|
+
function sanitizeSegment(value) {
|
|
13
|
+
const normalized = value.trim().replace(/[^a-zA-Z0-9._-]+/g, '-');
|
|
14
|
+
const collapsed = normalized.replace(/-+/g, '-').replace(/^-|-$/g, '');
|
|
15
|
+
return collapsed.length > 0 ? collapsed.toLowerCase() : 'unknown';
|
|
16
|
+
}
|
|
17
|
+
function createTimestampPrefix(now = new Date()) {
|
|
18
|
+
return now.toISOString().replace(/[-:]/g, '').replace(/\.\d{3}Z$/, 'Z');
|
|
19
|
+
}
|
|
20
|
+
function buildDefaultJsonExportPath(options) {
|
|
21
|
+
const baseDir = options.baseDir ?? process.cwd();
|
|
22
|
+
const filename = [
|
|
23
|
+
createTimestampPrefix(options.now),
|
|
24
|
+
sanitizeSegment(options.type),
|
|
25
|
+
sanitizeSegment(options.idLabel),
|
|
26
|
+
sanitizeSegment(options.id),
|
|
27
|
+
].join('-');
|
|
28
|
+
return node_path_1.default.join(baseDir, 'output', `${filename}.json`);
|
|
29
|
+
}
|
|
30
|
+
async function resolveJsonExportPath(requestedPath, defaultPath) {
|
|
31
|
+
if (!requestedPath || requestedPath.trim().length === 0) {
|
|
32
|
+
return defaultPath;
|
|
33
|
+
}
|
|
34
|
+
const resolved = node_path_1.default.resolve(requestedPath);
|
|
35
|
+
try {
|
|
36
|
+
const stat = await promises_1.default.stat(resolved);
|
|
37
|
+
if (stat.isDirectory()) {
|
|
38
|
+
return node_path_1.default.join(resolved, node_path_1.default.basename(defaultPath));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// If file does not exist yet, continue with extension normalization.
|
|
43
|
+
}
|
|
44
|
+
if (node_path_1.default.extname(resolved).toLowerCase() !== '.json') {
|
|
45
|
+
return `${resolved}.json`;
|
|
46
|
+
}
|
|
47
|
+
return resolved;
|
|
48
|
+
}
|
|
49
|
+
async function writeJsonExportFile(filePath, payload) {
|
|
50
|
+
await promises_1.default.mkdir(node_path_1.default.dirname(filePath), { recursive: true });
|
|
51
|
+
await promises_1.default.writeFile(filePath, `${JSON.stringify(payload, null, 2)}\n`, 'utf-8');
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=json-export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-export.js","sourceRoot":"","sources":["../../src/utils/json-export.ts"],"names":[],"mappings":";;;;;AASA,sDAEC;AAED,gEAgBC;AAED,sDAuBC;AAED,kDAGC;AA3DD,gEAAkC;AAClC,0DAA6B;AAE7B,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACvE,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACpE,CAAC;AAED,SAAgB,qBAAqB,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE;IACpD,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AAC1E,CAAC;AAED,SAAgB,0BAA0B,CAAC,OAM1C;IACC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAG;QACf,qBAAqB,CAAC,OAAO,CAAC,GAAG,CAAC;QAClC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC;QAC7B,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC;QAChC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;KAC5B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEZ,OAAO,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;AAC1D,CAAC;AAEM,KAAK,UAAU,qBAAqB,CACzC,aAAiC,EACjC,WAAmB;IAEnB,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,QAAQ,GAAG,mBAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,kBAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,OAAO,mBAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;IACvE,CAAC;IAED,IAAI,mBAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;QACrD,OAAO,GAAG,QAAQ,OAAO,CAAC;IAC5B,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAEM,KAAK,UAAU,mBAAmB,CAAC,QAAgB,EAAE,OAAgB;IAC1E,MAAM,kBAAE,CAAC,KAAK,CAAC,mBAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACjF,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ListEnvelope } from '../api/types';
|
|
2
|
+
import type { RuntimeConfig } from './config';
|
|
3
|
+
export declare function printData(value: unknown, config: Pick<RuntimeConfig, 'format' | 'compact'>, list?: boolean): void;
|
|
4
|
+
export declare function printListEnvelope(envelope: ListEnvelope<Record<string, unknown>>, config: Pick<RuntimeConfig, 'format' | 'compact'>): void;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.printData = printData;
|
|
4
|
+
exports.printListEnvelope = printListEnvelope;
|
|
5
|
+
const json_1 = require("../formatters/json");
|
|
6
|
+
const table_1 = require("../formatters/table");
|
|
7
|
+
const csv_1 = require("../formatters/csv");
|
|
8
|
+
const flatten_1 = require("./flatten");
|
|
9
|
+
function isRecord(value) {
|
|
10
|
+
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
11
|
+
}
|
|
12
|
+
function printData(value, config, list = false) {
|
|
13
|
+
if (config.format === 'json') {
|
|
14
|
+
if (list && Array.isArray(value)) {
|
|
15
|
+
const rows = config.compact
|
|
16
|
+
? value.map((item) => (isRecord(item) ? (0, flatten_1.compactObject)(item) : item))
|
|
17
|
+
: value;
|
|
18
|
+
process.stdout.write(`${(0, json_1.formatJson)({ pagination: { count: rows.length }, data: rows })}\n`);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (isRecord(value) && config.compact) {
|
|
22
|
+
process.stdout.write(`${(0, json_1.formatJson)((0, flatten_1.compactObject)(value))}\n`);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
process.stdout.write(`${(0, json_1.formatJson)(value)}\n`);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const rows = normalizeRows(value, config.compact, list);
|
|
29
|
+
if (config.format === 'table') {
|
|
30
|
+
process.stdout.write(`${(0, table_1.formatTable)(rows)}\n`);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
process.stdout.write(`${(0, csv_1.formatCsv)(rows)}\n`);
|
|
34
|
+
}
|
|
35
|
+
function printListEnvelope(envelope, config) {
|
|
36
|
+
if (config.format === 'json') {
|
|
37
|
+
const rows = config.compact ? (0, flatten_1.compactRows)(envelope.data) : envelope.data;
|
|
38
|
+
process.stdout.write(`${(0, json_1.formatJson)({ pagination: envelope.pagination, data: rows })}\n`);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const rows = normalizeRows(envelope.data, config.compact, true);
|
|
42
|
+
if (config.format === 'table') {
|
|
43
|
+
process.stdout.write(`${(0, table_1.formatTable)(rows)}\n`);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
process.stdout.write(`${(0, csv_1.formatCsv)(rows)}\n`);
|
|
47
|
+
}
|
|
48
|
+
function normalizeRows(value, compact, list = false) {
|
|
49
|
+
if (Array.isArray(value)) {
|
|
50
|
+
return value
|
|
51
|
+
.filter((item) => isRecord(item))
|
|
52
|
+
.map((item) => (0, flatten_1.flattenRow)(compact ? (0, flatten_1.compactObject)(item) : item));
|
|
53
|
+
}
|
|
54
|
+
if (isRecord(value)) {
|
|
55
|
+
const object = compact ? (0, flatten_1.compactObject)(value) : value;
|
|
56
|
+
if (list) {
|
|
57
|
+
return [(0, flatten_1.flattenRow)(object)];
|
|
58
|
+
}
|
|
59
|
+
return [(0, flatten_1.flattenRow)(object)];
|
|
60
|
+
}
|
|
61
|
+
return [{ value }];
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ListEnvelope, PaginationInfo } from '../api/types';
|
|
2
|
+
export declare function createListEnvelope<T>(data: T[], pagination?: PaginationInfo): ListEnvelope<T>;
|
|
3
|
+
export declare function collectAllOffset<T>(pageFn: (offset: number) => Promise<ListEnvelope<T>>, pageSize: number): Promise<ListEnvelope<T>>;
|
|
4
|
+
export declare function fromConnection<T>(connection: {
|
|
5
|
+
edges?: Array<{
|
|
6
|
+
node?: T | null;
|
|
7
|
+
} | null>;
|
|
8
|
+
pageInfo?: {
|
|
9
|
+
hasNextPage?: boolean;
|
|
10
|
+
endCursor?: string | null;
|
|
11
|
+
};
|
|
12
|
+
} | null | undefined): ListEnvelope<T>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createListEnvelope = createListEnvelope;
|
|
4
|
+
exports.collectAllOffset = collectAllOffset;
|
|
5
|
+
exports.fromConnection = fromConnection;
|
|
6
|
+
function createListEnvelope(data, pagination) {
|
|
7
|
+
return {
|
|
8
|
+
pagination: {
|
|
9
|
+
mode: pagination?.mode ?? 'none',
|
|
10
|
+
...pagination,
|
|
11
|
+
count: pagination?.count ?? data.length,
|
|
12
|
+
},
|
|
13
|
+
data,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
async function collectAllOffset(pageFn, pageSize) {
|
|
17
|
+
const all = [];
|
|
18
|
+
let offset = 0;
|
|
19
|
+
let hasMore = true;
|
|
20
|
+
while (hasMore) {
|
|
21
|
+
const page = await pageFn(offset);
|
|
22
|
+
all.push(...page.data);
|
|
23
|
+
offset += pageSize;
|
|
24
|
+
hasMore = page.data.length >= pageSize;
|
|
25
|
+
}
|
|
26
|
+
return createListEnvelope(all, {
|
|
27
|
+
mode: 'offset',
|
|
28
|
+
offset: 0,
|
|
29
|
+
limit: all.length,
|
|
30
|
+
count: all.length,
|
|
31
|
+
hasNextPage: false,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function fromConnection(connection) {
|
|
35
|
+
const edges = connection?.edges ?? [];
|
|
36
|
+
const data = edges
|
|
37
|
+
.map((edge) => edge?.node)
|
|
38
|
+
.filter((node) => node !== null && node !== undefined);
|
|
39
|
+
return createListEnvelope(data, {
|
|
40
|
+
mode: 'connection',
|
|
41
|
+
hasNextPage: connection?.pageInfo?.hasNextPage ?? false,
|
|
42
|
+
endCursor: connection?.pageInfo?.endCursor ?? null,
|
|
43
|
+
count: data.length,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/utils/pagination.ts"],"names":[],"mappings":";;AAEA,gDASC;AAED,4CAsBC;AAED,wCAoBC;AAvDD,SAAgB,kBAAkB,CAAI,IAAS,EAAE,UAA2B;IAC1E,OAAO;QACL,UAAU,EAAE;YACV,IAAI,EAAE,UAAU,EAAE,IAAI,IAAI,MAAM;YAChC,GAAG,UAAU;YACb,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,IAAI,CAAC,MAAM;SACxC;QACD,IAAI;KACL,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,gBAAgB,CACpC,MAAoD,EACpD,QAAgB;IAEhB,MAAM,GAAG,GAAQ,EAAE,CAAC;IACpB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,OAAO,GAAG,IAAI,CAAC;IAEnB,OAAO,OAAO,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,MAAM,IAAI,QAAQ,CAAC;QACnB,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC;IACzC,CAAC;IAED,OAAO,kBAAkB,CAAC,GAAG,EAAE;QAC7B,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,CAAC;QACT,KAAK,EAAE,GAAG,CAAC,MAAM;QACjB,KAAK,EAAE,GAAG,CAAC,MAAM;QACjB,WAAW,EAAE,KAAK;KACnB,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,cAAc,CAC5B,UAMa;IAEb,MAAM,KAAK,GAAG,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,KAAK;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;SACzB,MAAM,CAAC,CAAC,IAAI,EAAa,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC;IAEpE,OAAO,kBAAkB,CAAC,IAAI,EAAE;QAC9B,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,IAAI,KAAK;QACvD,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,IAAI,IAAI;QAClD,KAAK,EAAE,IAAI,CAAC,MAAM;KACnB,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.parseJsonInput = parseJsonInput;
|
|
7
|
+
exports.parseTextInput = parseTextInput;
|
|
8
|
+
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
const errors_1 = require("./errors");
|
|
11
|
+
async function parseJsonInput(input) {
|
|
12
|
+
if (!input) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
let content = input;
|
|
16
|
+
if (input.startsWith('@')) {
|
|
17
|
+
const file = node_path_1.default.resolve(process.cwd(), input.slice(1));
|
|
18
|
+
content = await promises_1.default.readFile(file, 'utf-8');
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
return JSON.parse(content);
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
throw new errors_1.CliError('VALIDATION_ERROR', `Invalid JSON input: ${input}`, error);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function parseTextInput(input) {
|
|
28
|
+
if (input.startsWith('@')) {
|
|
29
|
+
const file = node_path_1.default.resolve(process.cwd(), input.slice(1));
|
|
30
|
+
return promises_1.default.readFile(file, 'utf-8');
|
|
31
|
+
}
|
|
32
|
+
return input;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=parse-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-json.js","sourceRoot":"","sources":["../../src/utils/parse-json.ts"],"names":[],"mappings":";;;;;AAIA,wCAiBC;AAED,wCAMC;AA7BD,gEAAkC;AAClC,0DAA6B;AAC7B,qCAAoC;AAE7B,KAAK,UAAU,cAAc,CAAc,KAAc;IAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,OAAO,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,iBAAQ,CAAC,kBAAkB,EAAE,uBAAuB,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,KAAa;IAChD,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,OAAO,kBAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { PortfolioSummaryRow } from '../api/endpoints/metrics';
|
|
2
|
+
export interface PortfolioOverviewPayload {
|
|
3
|
+
cutOffDate: string;
|
|
4
|
+
fund: {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
};
|
|
8
|
+
performance: {
|
|
9
|
+
numberOfCashFlows: number;
|
|
10
|
+
numberOfNAVs: number;
|
|
11
|
+
balance: string;
|
|
12
|
+
tvpi: string;
|
|
13
|
+
dpi: string;
|
|
14
|
+
rvpi: string;
|
|
15
|
+
netIrr: string;
|
|
16
|
+
};
|
|
17
|
+
portfolioCompanies: Array<Record<string, unknown>>;
|
|
18
|
+
}
|
|
19
|
+
export declare function buildPortfolioOverviewPayload(input: {
|
|
20
|
+
fundId: string;
|
|
21
|
+
fundName?: string;
|
|
22
|
+
cutOffDate: string;
|
|
23
|
+
fundManagement: Record<string, unknown>;
|
|
24
|
+
summary: PortfolioSummaryRow[];
|
|
25
|
+
}): PortfolioOverviewPayload;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildPortfolioOverviewPayload = buildPortfolioOverviewPayload;
|
|
4
|
+
function asRecord(value) {
|
|
5
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
return value;
|
|
9
|
+
}
|
|
10
|
+
function toStringOrFallback(value, fallback) {
|
|
11
|
+
if (typeof value === 'string' && value.length > 0) {
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
if (typeof value === 'number' && Number.isFinite(value)) {
|
|
15
|
+
return String(value);
|
|
16
|
+
}
|
|
17
|
+
return fallback;
|
|
18
|
+
}
|
|
19
|
+
function toNumberOrFallback(value, fallback) {
|
|
20
|
+
if (typeof value === 'number' && Number.isFinite(value)) {
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
if (typeof value === 'string' && value.length > 0) {
|
|
24
|
+
const parsed = Number(value);
|
|
25
|
+
if (Number.isFinite(parsed)) {
|
|
26
|
+
return parsed;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return fallback;
|
|
30
|
+
}
|
|
31
|
+
function pickFundOrGpOrLocal(value) {
|
|
32
|
+
const record = asRecord(value);
|
|
33
|
+
if (record) {
|
|
34
|
+
if (record.fund !== undefined && record.fund !== null) {
|
|
35
|
+
return record.fund;
|
|
36
|
+
}
|
|
37
|
+
if (record.gp !== undefined && record.gp !== null) {
|
|
38
|
+
return record.gp;
|
|
39
|
+
}
|
|
40
|
+
if (record.local !== undefined && record.local !== null) {
|
|
41
|
+
return record.local;
|
|
42
|
+
}
|
|
43
|
+
// Keep export scalar-only for fund/gp/local objects even when all are null.
|
|
44
|
+
if ('fund' in record || 'gp' in record || 'local' in record) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return value ?? null;
|
|
49
|
+
}
|
|
50
|
+
function latestRoundDate(value) {
|
|
51
|
+
if (typeof value === 'string' && value.length > 0) {
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
const list = Array.isArray(value) ? value : [];
|
|
55
|
+
const dates = list
|
|
56
|
+
.map((item) => asRecord(item)?.eventDate)
|
|
57
|
+
.filter((item) => typeof item === 'string' && item.length > 0);
|
|
58
|
+
if (dates.length === 0) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
return dates.sort((a, b) => a.localeCompare(b)).at(-1) ?? null;
|
|
62
|
+
}
|
|
63
|
+
function findTotalRow(summary) {
|
|
64
|
+
return summary.find((row) => String(row.investmentName).trim().toUpperCase() === 'TOTAL');
|
|
65
|
+
}
|
|
66
|
+
function buildPortfolioOverviewPayload(input) {
|
|
67
|
+
const totalRow = findTotalRow(input.summary);
|
|
68
|
+
const totalDetails = asRecord(totalRow?.dashboardDetails);
|
|
69
|
+
const fundRecord = asRecord(input.fundManagement.fund);
|
|
70
|
+
const fundName = (typeof input.fundName === 'string' && input.fundName.length > 0
|
|
71
|
+
? input.fundName
|
|
72
|
+
: undefined) ??
|
|
73
|
+
(typeof fundRecord?.displayName === 'string' && fundRecord.displayName.length > 0
|
|
74
|
+
? fundRecord.displayName
|
|
75
|
+
: undefined) ??
|
|
76
|
+
input.fundId;
|
|
77
|
+
const performance = {
|
|
78
|
+
numberOfCashFlows: toNumberOrFallback(input.fundManagement.numberOfCashFlows, 0),
|
|
79
|
+
numberOfNAVs: toNumberOrFallback(input.fundManagement.numberOfNAVs, 0),
|
|
80
|
+
balance: toStringOrFallback(input.fundManagement.balance, '0'),
|
|
81
|
+
tvpi: toStringOrFallback(input.fundManagement.tvpi, toStringOrFallback(pickFundOrGpOrLocal(totalDetails?.multiple), '0')),
|
|
82
|
+
dpi: toStringOrFallback(input.fundManagement.dpi, '0'),
|
|
83
|
+
rvpi: toStringOrFallback(input.fundManagement.rvpi, '0'),
|
|
84
|
+
netIrr: toStringOrFallback(input.fundManagement.netIrr, toStringOrFallback(pickFundOrGpOrLocal(totalDetails?.irr), '0')),
|
|
85
|
+
};
|
|
86
|
+
const portfolioCompanies = input.summary.map((row) => {
|
|
87
|
+
const details = asRecord(row.dashboardDetails) ?? {};
|
|
88
|
+
const company = asRecord(row.portfolioCompany);
|
|
89
|
+
return {
|
|
90
|
+
id: row.id,
|
|
91
|
+
investmentName: row.investmentName,
|
|
92
|
+
portfolioCompanyId: typeof company?.id === 'string' ? company.id : null,
|
|
93
|
+
portfolioCompanyName: typeof company?.displayName === 'string' ? company.displayName : null,
|
|
94
|
+
ownership: details.ownership ?? null,
|
|
95
|
+
ownershipFD: details.ownershipFD ?? null,
|
|
96
|
+
investedEquity: pickFundOrGpOrLocal(details.investedEquity),
|
|
97
|
+
investedDebt: pickFundOrGpOrLocal(details.investedDebt),
|
|
98
|
+
investedFunds: pickFundOrGpOrLocal(details.investedFunds),
|
|
99
|
+
totalOriginalCost: pickFundOrGpOrLocal(details.totalOriginalCost),
|
|
100
|
+
irr: pickFundOrGpOrLocal(details.irr),
|
|
101
|
+
multiple: pickFundOrGpOrLocal(details.multiple),
|
|
102
|
+
latestInvestmentRoundDate: latestRoundDate(details.latestInvestmentRoundDate),
|
|
103
|
+
};
|
|
104
|
+
});
|
|
105
|
+
return {
|
|
106
|
+
cutOffDate: input.cutOffDate,
|
|
107
|
+
fund: {
|
|
108
|
+
id: input.fundId,
|
|
109
|
+
name: fundName,
|
|
110
|
+
},
|
|
111
|
+
performance,
|
|
112
|
+
portfolioCompanies,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=portfolio-overview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portfolio-overview.js","sourceRoot":"","sources":["../../src/utils/portfolio-overview.ts"],"names":[],"mappings":";;AA6FA,sEAqEC;AAhKD,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc,EAAE,QAAgB;IAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc,EAAE,QAAgB;IAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACtD,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC;QACD,IAAI,MAAM,CAAC,EAAE,KAAK,SAAS,IAAI,MAAM,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;YAClD,OAAO,MAAM,CAAC,EAAE,CAAC;QACnB,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxD,OAAO,MAAM,CAAC,KAAK,CAAC;QACtB,CAAC;QAED,4EAA4E;QAC5E,IAAI,MAAM,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;YAC5D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;SACxC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEjF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACjE,CAAC;AAED,SAAS,YAAY,CAAC,OAA8B;IAClD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,CAAC;AAC5F,CAAC;AAoBD,SAAgB,6BAA6B,CAC3C,KAMC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAEvD,MAAM,QAAQ,GACZ,CAAC,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QAC9D,CAAC,CAAC,KAAK,CAAC,QAAQ;QAChB,CAAC,CAAC,SAAS,CAAC;QACd,CAAC,OAAO,UAAU,EAAE,WAAW,KAAK,QAAQ,IAAI,UAAU,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YAC/E,CAAC,CAAC,UAAU,CAAC,WAAW;YACxB,CAAC,CAAC,SAAS,CAAC;QACd,KAAK,CAAC,MAAM,CAAC;IAEf,MAAM,WAAW,GAAG;QAClB,iBAAiB,EAAE,kBAAkB,CAAC,KAAK,CAAC,cAAc,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAChF,YAAY,EAAE,kBAAkB,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC,CAAC;QACtE,OAAO,EAAE,kBAAkB,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC;QAC9D,IAAI,EAAE,kBAAkB,CACtB,KAAK,CAAC,cAAc,CAAC,IAAI,EACzB,kBAAkB,CAAC,mBAAmB,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,CACrE;QACD,GAAG,EAAE,kBAAkB,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC;QACtD,IAAI,EAAE,kBAAkB,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC;QACxD,MAAM,EAAE,kBAAkB,CACxB,KAAK,CAAC,cAAc,CAAC,MAAM,EAC3B,kBAAkB,CAAC,mBAAmB,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAChE;KACF,CAAC;IAEF,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACnD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;QACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAE/C,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,cAAc,EAAE,GAAG,CAAC,cAAc;YAClC,kBAAkB,EAAE,OAAO,OAAO,EAAE,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;YACvE,oBAAoB,EAClB,OAAO,OAAO,EAAE,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI;YACvE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;YACpC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;YACxC,cAAc,EAAE,mBAAmB,CAAC,OAAO,CAAC,cAAc,CAAC;YAC3D,YAAY,EAAE,mBAAmB,CAAC,OAAO,CAAC,YAAY,CAAC;YACvD,aAAa,EAAE,mBAAmB,CAAC,OAAO,CAAC,aAAa,CAAC;YACzD,iBAAiB,EAAE,mBAAmB,CAAC,OAAO,CAAC,iBAAiB,CAAC;YACjE,GAAG,EAAE,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC;YACrC,QAAQ,EAAE,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC/C,yBAAyB,EAAE,eAAe,CAAC,OAAO,CAAC,yBAAyB,CAAC;SAC9E,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,IAAI,EAAE;YACJ,EAAE,EAAE,KAAK,CAAC,MAAM;YAChB,IAAI,EAAE,QAAQ;SACf;QACD,WAAW;QACX,kBAAkB;KACnB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function writeRunLog(payload: unknown): Promise<string>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.writeRunLog = writeRunLog;
|
|
7
|
+
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
async function writeRunLog(payload) {
|
|
10
|
+
const dir = node_path_1.default.join(process.cwd(), '.cache', 'runs');
|
|
11
|
+
await promises_1.default.mkdir(dir, { recursive: true });
|
|
12
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
13
|
+
const file = node_path_1.default.join(dir, `${stamp}.json`);
|
|
14
|
+
await promises_1.default.writeFile(file, JSON.stringify(payload, null, 2), 'utf-8');
|
|
15
|
+
return file;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=run-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-log.js","sourceRoot":"","sources":["../../src/utils/run-log.ts"],"names":[],"mappings":";;;;;AAGA,kCAOC;AAVD,gEAAkC;AAClC,0DAA6B;AAEtB,KAAK,UAAU,WAAW,CAAC,OAAgB;IAChD,MAAM,GAAG,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvD,MAAM,kBAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;IAC7C,MAAM,kBAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "vestberry-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Production-grade GraphQL CLI for Vestberry",
|
|
5
|
+
"private": false,
|
|
6
|
+
"main": "dist/cli.js",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist/",
|
|
9
|
+
"README.md",
|
|
10
|
+
"LICENSE"
|
|
11
|
+
],
|
|
12
|
+
"engines": {
|
|
13
|
+
"node": ">=18.0.0"
|
|
14
|
+
},
|
|
15
|
+
"scripts": {
|
|
16
|
+
"clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
|
|
17
|
+
"test": "vitest run",
|
|
18
|
+
"test:coverage": "vitest run --coverage",
|
|
19
|
+
"test:secrets": "node scripts/check-no-secrets.mjs",
|
|
20
|
+
"build": "npm run clean && tsc -p tsconfig.build.json",
|
|
21
|
+
"dev": "tsx src/cli.ts",
|
|
22
|
+
"lint": "eslint . --ext .ts",
|
|
23
|
+
"format": "prettier --check . && npm run lint",
|
|
24
|
+
"type-check": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit",
|
|
25
|
+
"verify": "npm run lint && npm run type-check && npm run test && npm run test:secrets && npm run build",
|
|
26
|
+
"test:integration": "vitest run tests/integration",
|
|
27
|
+
"prepare": "npm run build",
|
|
28
|
+
"prepublishOnly": "npm run verify"
|
|
29
|
+
},
|
|
30
|
+
"keywords": [
|
|
31
|
+
"vestberry",
|
|
32
|
+
"cli",
|
|
33
|
+
"graphql",
|
|
34
|
+
"portfolio",
|
|
35
|
+
"venture-capital",
|
|
36
|
+
"fund-management"
|
|
37
|
+
],
|
|
38
|
+
"license": "MIT",
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "https://github.com/IoVagabondo/vestberry-cli.git"
|
|
42
|
+
},
|
|
43
|
+
"bugs": {
|
|
44
|
+
"url": "https://github.com/IoVagabondo/vestberry-cli/issues"
|
|
45
|
+
},
|
|
46
|
+
"homepage": "https://github.com/IoVagabondo/vestberry-cli#readme",
|
|
47
|
+
"type": "commonjs",
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"axios": "^1.13.5",
|
|
50
|
+
"cli-table3": "^0.6.5",
|
|
51
|
+
"commander": "^14.0.3",
|
|
52
|
+
"csv-stringify": "^6.6.0",
|
|
53
|
+
"dotenv": "^17.3.1",
|
|
54
|
+
"zod": "^4.3.6"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
58
|
+
"@types/node": "^25.2.3",
|
|
59
|
+
"@typescript-eslint/eslint-plugin": "^8.55.0",
|
|
60
|
+
"@typescript-eslint/parser": "^8.55.0",
|
|
61
|
+
"eslint": "^9.39.2",
|
|
62
|
+
"prettier": "^3.8.1",
|
|
63
|
+
"tsx": "^4.21.0",
|
|
64
|
+
"typescript": "^5.9.3",
|
|
65
|
+
"vitest": "^4.0.18"
|
|
66
|
+
},
|
|
67
|
+
"bin": {
|
|
68
|
+
"vestberry": "dist/cli.js"
|
|
69
|
+
}
|
|
70
|
+
}
|