@ldsg/cli 0.3.28 → 0.3.30
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/.rush/temp/package-deps_build.json +22 -5
- package/.tsbuildinfo +1 -1
- package/CHANGELOG.json +52 -0
- package/CHANGELOG.md +15 -1
- package/dist/__tests__/commands.test.d.ts +1 -0
- package/dist/__tests__/commands.test.js +219 -0
- package/dist/__tests__/commands.test.js.map +1 -0
- package/dist/__tests__/formatter.test.d.ts +1 -0
- package/dist/__tests__/formatter.test.js +114 -0
- package/dist/__tests__/formatter.test.js.map +1 -0
- package/dist/__tests__/json-file-mutator.test.d.ts +1 -0
- package/dist/__tests__/json-file-mutator.test.js +103 -0
- package/dist/__tests__/json-file-mutator.test.js.map +1 -0
- package/dist/__tests__/source-resolver.test.d.ts +1 -0
- package/dist/__tests__/source-resolver.test.js +101 -0
- package/dist/__tests__/source-resolver.test.js.map +1 -0
- package/dist/cli.js +304 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/resource/convert.d.ts +11 -0
- package/dist/commands/resource/convert.js +42 -0
- package/dist/commands/resource/convert.js.map +1 -0
- package/dist/commands/resource/create.d.ts +14 -0
- package/dist/commands/resource/create.js +37 -0
- package/dist/commands/resource/create.js.map +1 -0
- package/dist/commands/resource/delete.d.ts +10 -0
- package/dist/commands/resource/delete.js +10 -0
- package/dist/commands/resource/delete.js.map +1 -0
- package/dist/commands/resource/diff.d.ts +10 -0
- package/dist/commands/resource/diff.js +72 -0
- package/dist/commands/resource/diff.js.map +1 -0
- package/dist/commands/resource/get.d.ts +6 -0
- package/dist/commands/resource/get.js +6 -0
- package/dist/commands/resource/get.js.map +1 -0
- package/dist/commands/resource/list.d.ts +30 -0
- package/dist/commands/resource/list.js +138 -0
- package/dist/commands/resource/list.js.map +1 -0
- package/dist/commands/resource/tree.d.ts +2 -0
- package/dist/commands/resource/tree.js +6 -0
- package/dist/commands/resource/tree.js.map +1 -0
- package/dist/commands/resource/update.d.ts +11 -0
- package/dist/commands/resource/update.js +13 -0
- package/dist/commands/resource/update.js.map +1 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.js +3 -1
- package/dist/constants.js.map +1 -1
- package/dist/types/resource-record.d.ts +43 -0
- package/dist/types/resource-record.js +3 -0
- package/dist/types/resource-record.js.map +1 -0
- package/dist/utils/formatter.d.ts +12 -0
- package/dist/utils/formatter.js +96 -0
- package/dist/utils/formatter.js.map +1 -0
- package/dist/utils/json-file-mutator.d.ts +15 -0
- package/dist/utils/json-file-mutator.js +109 -0
- package/dist/utils/json-file-mutator.js.map +1 -0
- package/dist/utils/source-resolver.d.ts +4 -0
- package/dist/utils/source-resolver.js +93 -0
- package/dist/utils/source-resolver.js.map +1 -0
- package/jest.config.js +12 -0
- package/package.json +8 -6
- package/src/__tests__/commands.test.ts +262 -0
- package/src/__tests__/formatter.test.ts +133 -0
- package/src/__tests__/json-file-mutator.test.ts +136 -0
- package/src/__tests__/source-resolver.test.ts +125 -0
- package/src/cli.ts +309 -1
- package/src/commands/resource/convert.ts +52 -0
- package/src/commands/resource/create.ts +49 -0
- package/src/commands/resource/delete.ts +15 -0
- package/src/commands/resource/diff.ts +104 -0
- package/src/commands/resource/get.ts +5 -0
- package/src/commands/resource/list.ts +161 -0
- package/src/commands/resource/tree.ts +4 -0
- package/src/commands/resource/update.ts +21 -0
- package/src/constants.ts +3 -0
- package/src/types/resource-record.ts +52 -0
- package/src/utils/formatter.ts +106 -0
- package/src/utils/json-file-mutator.ts +137 -0
- package/src/utils/source-resolver.ts +102 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.diffResource = diffResource;
|
|
4
|
+
function isObject(value) {
|
|
5
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
6
|
+
}
|
|
7
|
+
function deepDiff(objA, objB, basePath = '') {
|
|
8
|
+
const changed = [];
|
|
9
|
+
const added = [];
|
|
10
|
+
const removed = [];
|
|
11
|
+
const allKeys = new Set([...Object.keys(objA), ...Object.keys(objB)]);
|
|
12
|
+
for (const key of allKeys) {
|
|
13
|
+
const path = basePath ? `${basePath}.${key}` : key;
|
|
14
|
+
const valA = objA[key];
|
|
15
|
+
const valB = objB[key];
|
|
16
|
+
if (key in objA && !(key in objB)) {
|
|
17
|
+
removed.push({ path, from: valA });
|
|
18
|
+
}
|
|
19
|
+
else if (!(key in objA) && key in objB) {
|
|
20
|
+
added.push({ path, value: valB });
|
|
21
|
+
}
|
|
22
|
+
else if (isObject(valA) && isObject(valB)) {
|
|
23
|
+
const nested = deepDiff(valA, valB, path);
|
|
24
|
+
changed.push(...nested.changed);
|
|
25
|
+
added.push(...nested.added);
|
|
26
|
+
removed.push(...nested.removed);
|
|
27
|
+
}
|
|
28
|
+
else if (valA !== valB) {
|
|
29
|
+
changed.push({ path, from: valA, to: valB });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return { changed, added, removed };
|
|
33
|
+
}
|
|
34
|
+
async function diffResource(options) {
|
|
35
|
+
const { sourceA, sourceB, id, recordsA, recordsB } = options;
|
|
36
|
+
const recordA = recordsA.find((r) => r.id === id) || null;
|
|
37
|
+
const recordB = recordsB.find((r) => r.id === id) || null;
|
|
38
|
+
const result = {
|
|
39
|
+
id,
|
|
40
|
+
kind: (recordA || recordB)?.kind || '',
|
|
41
|
+
sourceA,
|
|
42
|
+
sourceB,
|
|
43
|
+
changed: [],
|
|
44
|
+
added: [],
|
|
45
|
+
removed: [],
|
|
46
|
+
sideA: recordA,
|
|
47
|
+
sideB: recordB
|
|
48
|
+
};
|
|
49
|
+
if (!recordA || !recordB) {
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
if (recordA.kind !== recordB.kind) {
|
|
53
|
+
result.changed.push({
|
|
54
|
+
path: 'kind',
|
|
55
|
+
from: recordA.kind,
|
|
56
|
+
to: recordB.kind
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (recordA.parentId !== recordB.parentId) {
|
|
60
|
+
result.changed.push({
|
|
61
|
+
path: 'parentId',
|
|
62
|
+
from: recordA.parentId || null,
|
|
63
|
+
to: recordB.parentId || null
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
const settingsDiff = deepDiff(recordA.settings || {}, recordB.settings || {});
|
|
67
|
+
result.changed.push(...settingsDiff.changed);
|
|
68
|
+
result.added.push(...settingsDiff.added);
|
|
69
|
+
result.removed.push(...settingsDiff.removed);
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/commands/resource/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getResource = void 0;
|
|
4
|
+
const list_1 = require("./list");
|
|
5
|
+
Object.defineProperty(exports, "getResource", { enumerable: true, get: function () { return list_1.getResource; } });
|
|
6
|
+
//# sourceMappingURL=get.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/commands/resource/get.ts"],"names":[],"mappings":";;;AACA,iCAAqC;AAE5B,4FAFA,kBAAW,OAEA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ResourceRecord, ResourceRecords } from '@ldsg/types';
|
|
2
|
+
import { ResourceFilter } from '../../types/resource-record';
|
|
3
|
+
declare function filterByKind(records: ResourceRecords, kind?: string): ResourceRecords;
|
|
4
|
+
declare function filterByParentId(records: ResourceRecords, parentId?: string): ResourceRecords;
|
|
5
|
+
declare function filterByRootId(records: ResourceRecords, rootId?: string): ResourceRecords;
|
|
6
|
+
declare function buildChildMap(records: ResourceRecords): Map<string, ResourceRecord[]>;
|
|
7
|
+
declare function findRoots(records: ResourceRecords): ResourceRecord[];
|
|
8
|
+
declare function buildTree(records: ResourceRecords, rootId: string): {
|
|
9
|
+
resource: ResourceRecord;
|
|
10
|
+
children: unknown[];
|
|
11
|
+
} | null;
|
|
12
|
+
export declare function listResources(records: ResourceRecords, filter: ResourceFilter): Promise<{
|
|
13
|
+
total: number;
|
|
14
|
+
resources: ResourceRecords;
|
|
15
|
+
}>;
|
|
16
|
+
export declare function getResource(records: ResourceRecords, id: string, options: {
|
|
17
|
+
children?: boolean;
|
|
18
|
+
tree?: boolean;
|
|
19
|
+
}): Promise<ResourceRecord | (ResourceRecord & {
|
|
20
|
+
children?: ResourceRecords;
|
|
21
|
+
tree?: unknown;
|
|
22
|
+
}) | null>;
|
|
23
|
+
export declare function getTree(records: ResourceRecords, rootId?: string, showKind?: boolean): Promise<{
|
|
24
|
+
rootId: string;
|
|
25
|
+
tree: {
|
|
26
|
+
resource: ResourceRecord;
|
|
27
|
+
children: unknown[];
|
|
28
|
+
};
|
|
29
|
+
}>;
|
|
30
|
+
export { filterByKind, filterByParentId, filterByRootId, buildChildMap, findRoots, buildTree };
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.listResources = listResources;
|
|
4
|
+
exports.getResource = getResource;
|
|
5
|
+
exports.getTree = getTree;
|
|
6
|
+
exports.filterByKind = filterByKind;
|
|
7
|
+
exports.filterByParentId = filterByParentId;
|
|
8
|
+
exports.filterByRootId = filterByRootId;
|
|
9
|
+
exports.buildChildMap = buildChildMap;
|
|
10
|
+
exports.findRoots = findRoots;
|
|
11
|
+
exports.buildTree = buildTree;
|
|
12
|
+
function filterByKind(records, kind) {
|
|
13
|
+
if (!kind)
|
|
14
|
+
return records;
|
|
15
|
+
return records.filter((r) => r.kind === kind);
|
|
16
|
+
}
|
|
17
|
+
function filterByParentId(records, parentId) {
|
|
18
|
+
if (parentId === undefined || parentId === null)
|
|
19
|
+
return records;
|
|
20
|
+
return records.filter((r) => r.parentId === parentId);
|
|
21
|
+
}
|
|
22
|
+
function getDescendantIds(allRecords, rootId) {
|
|
23
|
+
const childMap = new Map();
|
|
24
|
+
for (const r of allRecords) {
|
|
25
|
+
const pid = r.parentId || 'null';
|
|
26
|
+
if (!childMap.has(pid))
|
|
27
|
+
childMap.set(pid, []);
|
|
28
|
+
childMap.get(pid).push(r.id);
|
|
29
|
+
}
|
|
30
|
+
const result = new Set();
|
|
31
|
+
const queue = [rootId];
|
|
32
|
+
while (queue.length > 0) {
|
|
33
|
+
const id = queue.shift();
|
|
34
|
+
if (result.has(id))
|
|
35
|
+
continue;
|
|
36
|
+
result.add(id);
|
|
37
|
+
const children = childMap.get(id) || [];
|
|
38
|
+
for (const childId of children) {
|
|
39
|
+
queue.push(childId);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
function filterByRootId(records, rootId) {
|
|
45
|
+
if (!rootId)
|
|
46
|
+
return records;
|
|
47
|
+
const ids = getDescendantIds(records, rootId);
|
|
48
|
+
return records.filter((r) => ids.has(r.id));
|
|
49
|
+
}
|
|
50
|
+
function buildChildMap(records) {
|
|
51
|
+
const map = new Map();
|
|
52
|
+
for (const r of records) {
|
|
53
|
+
const pid = r.parentId || 'null';
|
|
54
|
+
if (!map.has(pid))
|
|
55
|
+
map.set(pid, []);
|
|
56
|
+
map.get(pid).push(r);
|
|
57
|
+
}
|
|
58
|
+
return map;
|
|
59
|
+
}
|
|
60
|
+
function findRoots(records) {
|
|
61
|
+
const roots = records.filter((r) => r.parentId === null || r.parentId === 'root');
|
|
62
|
+
if (roots.length > 0)
|
|
63
|
+
return roots;
|
|
64
|
+
const allParentIds = new Set(records.map((r) => r.parentId).filter(Boolean));
|
|
65
|
+
return records.filter((r) => !allParentIds.has(r.id));
|
|
66
|
+
}
|
|
67
|
+
function buildTree(records, rootId) {
|
|
68
|
+
const root = records.find((r) => r.id === rootId);
|
|
69
|
+
if (!root)
|
|
70
|
+
return null;
|
|
71
|
+
const childMap = buildChildMap(records);
|
|
72
|
+
function buildSubTree(nodeId) {
|
|
73
|
+
const node = records.find((r) => r.id === nodeId);
|
|
74
|
+
const children = (childMap.get(nodeId) || []).map((child) => buildSubTree(child.id));
|
|
75
|
+
return { resource: node, children };
|
|
76
|
+
}
|
|
77
|
+
return buildSubTree(rootId);
|
|
78
|
+
}
|
|
79
|
+
async function listResources(records, filter) {
|
|
80
|
+
let result = records;
|
|
81
|
+
result = filterByKind(result, filter.kind);
|
|
82
|
+
result = filterByParentId(result, filter.parentId);
|
|
83
|
+
result = filterByRootId(result, filter.rootId);
|
|
84
|
+
return {
|
|
85
|
+
total: result.length,
|
|
86
|
+
resources: result
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
async function getResource(records, id, options) {
|
|
90
|
+
const record = records.find((r) => r.id === id);
|
|
91
|
+
if (!record)
|
|
92
|
+
return null;
|
|
93
|
+
if (options.tree) {
|
|
94
|
+
const tree = buildTree(records, id);
|
|
95
|
+
return { ...record, tree: tree ? tree : null };
|
|
96
|
+
}
|
|
97
|
+
if (options.children) {
|
|
98
|
+
const children = records.filter((r) => r.parentId === id);
|
|
99
|
+
return { ...record, children };
|
|
100
|
+
}
|
|
101
|
+
return record;
|
|
102
|
+
}
|
|
103
|
+
async function getTree(records, rootId, showKind) {
|
|
104
|
+
let effectiveRootId = rootId;
|
|
105
|
+
if (!effectiveRootId) {
|
|
106
|
+
const roots = findRoots(records);
|
|
107
|
+
if (roots.length === 0) {
|
|
108
|
+
throw new Error('No root resource found. Specify a root-id.');
|
|
109
|
+
}
|
|
110
|
+
if (roots.length === 1) {
|
|
111
|
+
effectiveRootId = roots[0].id;
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
effectiveRootId = '__virtual_root__';
|
|
115
|
+
const virtualRoot = {
|
|
116
|
+
id: '__virtual_root__',
|
|
117
|
+
kind: 'virtual',
|
|
118
|
+
parentId: null,
|
|
119
|
+
settings: { title: 'Virtual Root' }
|
|
120
|
+
};
|
|
121
|
+
const childMap = buildChildMap(records);
|
|
122
|
+
const children = roots.map((r) => buildTree(records, r.id)).filter(Boolean);
|
|
123
|
+
return {
|
|
124
|
+
rootId: effectiveRootId,
|
|
125
|
+
tree: {
|
|
126
|
+
resource: virtualRoot,
|
|
127
|
+
children: showKind ? children : children
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
const tree = buildTree(records, effectiveRootId);
|
|
133
|
+
if (!tree) {
|
|
134
|
+
throw new Error(`Resource with id "${effectiveRootId}" not found`);
|
|
135
|
+
}
|
|
136
|
+
return { rootId: effectiveRootId, tree };
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/resource/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getTree = void 0;
|
|
4
|
+
const list_1 = require("./list");
|
|
5
|
+
Object.defineProperty(exports, "getTree", { enumerable: true, get: function () { return list_1.getTree; } });
|
|
6
|
+
//# sourceMappingURL=tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../../../src/commands/resource/tree.ts"],"names":[],"mappings":";;;AACA,iCAAiC;AAExB,wFAFA,cAAO,OAEA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ResourceRecord } from '@ldsg/types';
|
|
2
|
+
import { SourceData } from '../../types/resource-record';
|
|
3
|
+
export interface UpdateOptions {
|
|
4
|
+
sourceData: SourceData;
|
|
5
|
+
id: string;
|
|
6
|
+
settings: Record<string, unknown>;
|
|
7
|
+
dryRun?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function updateResource(options: UpdateOptions): Promise<{
|
|
10
|
+
record: ResourceRecord;
|
|
11
|
+
}>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.updateResource = updateResource;
|
|
4
|
+
const json_file_mutator_1 = require("../../utils/json-file-mutator");
|
|
5
|
+
async function updateResource(options) {
|
|
6
|
+
const { sourceData, id, settings, dryRun } = options;
|
|
7
|
+
if (!settings || Object.keys(settings).length === 0) {
|
|
8
|
+
throw new Error('Missing required option: --settings');
|
|
9
|
+
}
|
|
10
|
+
const result = await (0, json_file_mutator_1.updateRecord)(sourceData, id, settings, dryRun);
|
|
11
|
+
return { record: result.record };
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/resource/update.ts"],"names":[],"mappings":";;AAWA,wCASC;AAlBD,qEAA6D;AAStD,KAAK,UAAU,cAAc,CAAC,OAAsB;IACzD,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAErD,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAA,gCAAY,EAAC,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACpE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACnC,CAAC"}
|
package/dist/constants.d.ts
CHANGED
package/dist/constants.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DEFAULT_OUTPUT_PATH = void 0;
|
|
3
|
+
exports.DEFAULT_SOURCE_PATH = exports.DEFAULT_SOURCE_FILE = exports.DEFAULT_OUTPUT_PATH = void 0;
|
|
4
4
|
exports.DEFAULT_OUTPUT_PATH = '.';
|
|
5
|
+
exports.DEFAULT_SOURCE_FILE = 'resource-records.json';
|
|
6
|
+
exports.DEFAULT_SOURCE_PATH = `./${exports.DEFAULT_SOURCE_FILE}`;
|
|
5
7
|
//# sourceMappingURL=constants.js.map
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,mBAAmB,GAAG,GAAG,CAAC"}
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,mBAAmB,GAAG,GAAG,CAAC;AAE1B,QAAA,mBAAmB,GAAG,uBAAuB,CAAC;AAC9C,QAAA,mBAAmB,GAAG,KAAK,2BAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { ResourceRecord, ResourceRecords } from '@ldsg/types';
|
|
2
|
+
export interface CliError {
|
|
3
|
+
code: string;
|
|
4
|
+
message: string;
|
|
5
|
+
}
|
|
6
|
+
export interface CliResponse<T = unknown> {
|
|
7
|
+
success: boolean;
|
|
8
|
+
data?: T;
|
|
9
|
+
error?: CliError;
|
|
10
|
+
}
|
|
11
|
+
export interface ResourceFilter {
|
|
12
|
+
kind?: string;
|
|
13
|
+
parentId?: string;
|
|
14
|
+
rootId?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface TreeNode {
|
|
17
|
+
resource: ResourceRecord;
|
|
18
|
+
children: TreeNode[];
|
|
19
|
+
}
|
|
20
|
+
export interface DiffResultField {
|
|
21
|
+
path: string;
|
|
22
|
+
from?: unknown;
|
|
23
|
+
to?: unknown;
|
|
24
|
+
value?: unknown;
|
|
25
|
+
}
|
|
26
|
+
export interface DiffResult {
|
|
27
|
+
id: string;
|
|
28
|
+
kind: string;
|
|
29
|
+
sourceA: string;
|
|
30
|
+
sourceB: string;
|
|
31
|
+
changed: DiffResultField[];
|
|
32
|
+
added: DiffResultField[];
|
|
33
|
+
removed: DiffResultField[];
|
|
34
|
+
sideA: ResourceRecord | null;
|
|
35
|
+
sideB: ResourceRecord | null;
|
|
36
|
+
}
|
|
37
|
+
export type SourceFormat = 'array' | 'object';
|
|
38
|
+
export interface SourceData {
|
|
39
|
+
resourceRecords: ResourceRecords;
|
|
40
|
+
format: SourceFormat;
|
|
41
|
+
filePath: string;
|
|
42
|
+
}
|
|
43
|
+
export { ResourceRecord, ResourceRecords };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-record.js","sourceRoot":"","sources":["../../src/types/resource-record.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { CliResponse, TreeNode, DiffResult } from '../types/resource-record';
|
|
2
|
+
export declare function formatSuccess<T>(data: T): CliResponse<T>;
|
|
3
|
+
export declare function formatError(code: string, message: string): CliResponse<never>;
|
|
4
|
+
export declare function formatJson(data: unknown): string;
|
|
5
|
+
export declare function formatPrettyList(resources: {
|
|
6
|
+
id: string;
|
|
7
|
+
kind: string;
|
|
8
|
+
parentId: string | null;
|
|
9
|
+
title?: string;
|
|
10
|
+
}[]): string;
|
|
11
|
+
export declare function formatPrettyTree(node: TreeNode, showKind: boolean, indent?: string): string;
|
|
12
|
+
export declare function formatPrettyDiff(diff: DiffResult): string;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatSuccess = formatSuccess;
|
|
4
|
+
exports.formatError = formatError;
|
|
5
|
+
exports.formatJson = formatJson;
|
|
6
|
+
exports.formatPrettyList = formatPrettyList;
|
|
7
|
+
exports.formatPrettyTree = formatPrettyTree;
|
|
8
|
+
exports.formatPrettyDiff = formatPrettyDiff;
|
|
9
|
+
function formatSuccess(data) {
|
|
10
|
+
return { success: true, data };
|
|
11
|
+
}
|
|
12
|
+
function formatError(code, message) {
|
|
13
|
+
return { success: false, error: { code, message } };
|
|
14
|
+
}
|
|
15
|
+
function formatJson(data) {
|
|
16
|
+
return JSON.stringify(data, null, 2);
|
|
17
|
+
}
|
|
18
|
+
function formatValue(value) {
|
|
19
|
+
if (value === null || value === undefined) {
|
|
20
|
+
return 'null';
|
|
21
|
+
}
|
|
22
|
+
if (typeof value === 'string') {
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
if (typeof value === 'object') {
|
|
26
|
+
return JSON.stringify(value);
|
|
27
|
+
}
|
|
28
|
+
return String(value);
|
|
29
|
+
}
|
|
30
|
+
function formatPrettyList(resources) {
|
|
31
|
+
if (resources.length === 0) {
|
|
32
|
+
return 'No resources found.';
|
|
33
|
+
}
|
|
34
|
+
const lines = [];
|
|
35
|
+
lines.push(`${'ID'.padEnd(30)} ${'KIND'.padEnd(20)} PARENT ID`);
|
|
36
|
+
lines.push('-'.repeat(70));
|
|
37
|
+
for (const r of resources) {
|
|
38
|
+
const title = r.title || '';
|
|
39
|
+
const displayId = title ? `${r.id} (${title})` : r.id;
|
|
40
|
+
lines.push(`${displayId.padEnd(30)} ${r.kind.padEnd(20)} ${r.parentId || '-'}`);
|
|
41
|
+
}
|
|
42
|
+
lines.push('');
|
|
43
|
+
lines.push(`Total: ${resources.length} resource(s)`);
|
|
44
|
+
return lines.join('\n');
|
|
45
|
+
}
|
|
46
|
+
function formatPrettyTree(node, showKind, indent = '') {
|
|
47
|
+
const prefix = indent ? indent.slice(0, -4) + (indent.endsWith('└── ') ? ' ' : '│ ') : '';
|
|
48
|
+
const label = showKind ? `[${node.resource.kind}] ${node.resource.id}` : node.resource.id;
|
|
49
|
+
if (indent === '') {
|
|
50
|
+
const lines = [label];
|
|
51
|
+
for (let i = 0; i < node.children.length; i++) {
|
|
52
|
+
const child = node.children[i];
|
|
53
|
+
const connector = i === node.children.length - 1 ? '└── ' : '├── ';
|
|
54
|
+
lines.push(formatPrettyTree(child, showKind, connector));
|
|
55
|
+
}
|
|
56
|
+
return lines.join('\n');
|
|
57
|
+
}
|
|
58
|
+
const result = `${indent}${label}`;
|
|
59
|
+
const childLines = [];
|
|
60
|
+
for (let i = 0; i < node.children.length; i++) {
|
|
61
|
+
const child = node.children[i];
|
|
62
|
+
const connector = i === node.children.length - 1 ? '└── ' : '├── ';
|
|
63
|
+
childLines.push(formatPrettyTree(child, showKind, `${prefix}${connector}`));
|
|
64
|
+
}
|
|
65
|
+
return [result, ...childLines].join('\n');
|
|
66
|
+
}
|
|
67
|
+
function formatPrettyDiff(diff) {
|
|
68
|
+
const lines = [];
|
|
69
|
+
lines.push(`Resource: ${diff.id} (${diff.kind})`);
|
|
70
|
+
lines.push(`Source A: ${diff.sourceA}`);
|
|
71
|
+
lines.push(`Source B: ${diff.sourceB}`);
|
|
72
|
+
lines.push('');
|
|
73
|
+
if (diff.sideA === null) {
|
|
74
|
+
lines.push('⚠ Resource only exists in source B (new)');
|
|
75
|
+
return lines.join('\n');
|
|
76
|
+
}
|
|
77
|
+
if (diff.sideB === null) {
|
|
78
|
+
lines.push('⚠ Resource only exists in source A (removed)');
|
|
79
|
+
return lines.join('\n');
|
|
80
|
+
}
|
|
81
|
+
if (diff.changed.length === 0 && diff.added.length === 0 && diff.removed.length === 0) {
|
|
82
|
+
lines.push('No differences found.');
|
|
83
|
+
return lines.join('\n');
|
|
84
|
+
}
|
|
85
|
+
for (const field of diff.changed) {
|
|
86
|
+
lines.push(` ${field.path}: "${formatValue(field.from)}" → "${formatValue(field.to)}"`);
|
|
87
|
+
}
|
|
88
|
+
for (const field of diff.added) {
|
|
89
|
+
lines.push(` ${field.path}: +"${formatValue(field.value)}"`);
|
|
90
|
+
}
|
|
91
|
+
for (const field of diff.removed) {
|
|
92
|
+
lines.push(` ${field.path}: -"${formatValue(field.from)}"`);
|
|
93
|
+
}
|
|
94
|
+
return lines.join('\n');
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/utils/formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ResourceRecord, ResourceRecords } from '@ldsg/types';
|
|
2
|
+
import { SourceData } from '../types/resource-record';
|
|
3
|
+
export declare function generateId(): string;
|
|
4
|
+
export declare function appendRecord(sourceData: SourceData, record: ResourceRecord, dryRun?: boolean): Promise<{
|
|
5
|
+
record: ResourceRecord;
|
|
6
|
+
allRecords: ResourceRecords;
|
|
7
|
+
}>;
|
|
8
|
+
export declare function updateRecord(sourceData: SourceData, id: string, settings: Record<string, unknown>, dryRun?: boolean): Promise<{
|
|
9
|
+
record: ResourceRecord;
|
|
10
|
+
allRecords: ResourceRecords;
|
|
11
|
+
}>;
|
|
12
|
+
export declare function removeRecord(sourceData: SourceData, id: string, dryRun?: boolean): Promise<{
|
|
13
|
+
removed: ResourceRecord[];
|
|
14
|
+
allRecords: ResourceRecords;
|
|
15
|
+
}>;
|
|
@@ -0,0 +1,109 @@
|
|
|
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.generateId = generateId;
|
|
7
|
+
exports.appendRecord = appendRecord;
|
|
8
|
+
exports.updateRecord = updateRecord;
|
|
9
|
+
exports.removeRecord = removeRecord;
|
|
10
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
11
|
+
function buildChildMap(resourceRecords) {
|
|
12
|
+
const childMap = new Map();
|
|
13
|
+
for (const record of resourceRecords) {
|
|
14
|
+
const pid = record.parentId || 'null';
|
|
15
|
+
const children = childMap.get(pid) || [];
|
|
16
|
+
children.push(record);
|
|
17
|
+
childMap.set(pid, children);
|
|
18
|
+
}
|
|
19
|
+
return childMap;
|
|
20
|
+
}
|
|
21
|
+
function getDescendantIds(resourceRecords, id) {
|
|
22
|
+
const childMap = buildChildMap(resourceRecords);
|
|
23
|
+
const ids = [];
|
|
24
|
+
const queue = [id];
|
|
25
|
+
while (queue.length > 0) {
|
|
26
|
+
const currentId = queue.shift();
|
|
27
|
+
ids.push(currentId);
|
|
28
|
+
const children = childMap.get(currentId) || [];
|
|
29
|
+
for (const child of children) {
|
|
30
|
+
queue.push(child.id);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return ids;
|
|
34
|
+
}
|
|
35
|
+
function extractSourceData(data) {
|
|
36
|
+
if (Array.isArray(data)) {
|
|
37
|
+
return { records: data, isArray: true };
|
|
38
|
+
}
|
|
39
|
+
if (data && typeof data === 'object') {
|
|
40
|
+
const obj = data;
|
|
41
|
+
if (Array.isArray(obj.resourceRecords)) {
|
|
42
|
+
return { records: obj.resourceRecords, isArray: false };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
throw new Error('Invalid resource records format');
|
|
46
|
+
}
|
|
47
|
+
function buildOutputData(records, isArray) {
|
|
48
|
+
if (isArray) {
|
|
49
|
+
return records;
|
|
50
|
+
}
|
|
51
|
+
return { resourceRecords: records };
|
|
52
|
+
}
|
|
53
|
+
async function readSourceFile(filePath) {
|
|
54
|
+
const data = await fs_extra_1.default.readJson(filePath);
|
|
55
|
+
return extractSourceData(data);
|
|
56
|
+
}
|
|
57
|
+
async function writeSourceFile(filePath, records, isArray) {
|
|
58
|
+
const output = buildOutputData(records, isArray);
|
|
59
|
+
await fs_extra_1.default.writeJson(filePath, output, { spaces: 2 });
|
|
60
|
+
}
|
|
61
|
+
function generateId() {
|
|
62
|
+
const timestamp = Date.now().toString(36);
|
|
63
|
+
const random = Math.random().toString(36).substring(2, 8);
|
|
64
|
+
return `${timestamp}-${random}`;
|
|
65
|
+
}
|
|
66
|
+
async function appendRecord(sourceData, record, dryRun = false) {
|
|
67
|
+
const { records, isArray } = await readSourceFile(sourceData.filePath);
|
|
68
|
+
const existingIndex = records.findIndex((r) => r.id === record.id);
|
|
69
|
+
if (existingIndex >= 0) {
|
|
70
|
+
throw new Error(`Resource with id "${record.id}" already exists`);
|
|
71
|
+
}
|
|
72
|
+
const allRecords = [...records, record];
|
|
73
|
+
if (!dryRun) {
|
|
74
|
+
await writeSourceFile(sourceData.filePath, allRecords, isArray);
|
|
75
|
+
}
|
|
76
|
+
return { record, allRecords };
|
|
77
|
+
}
|
|
78
|
+
async function updateRecord(sourceData, id, settings, dryRun = false) {
|
|
79
|
+
const { records, isArray } = await readSourceFile(sourceData.filePath);
|
|
80
|
+
const index = records.findIndex((r) => r.id === id);
|
|
81
|
+
if (index < 0) {
|
|
82
|
+
throw new Error(`Resource with id "${id}" not found`);
|
|
83
|
+
}
|
|
84
|
+
const updatedRecord = {
|
|
85
|
+
...records[index],
|
|
86
|
+
settings: { ...records[index].settings, ...settings }
|
|
87
|
+
};
|
|
88
|
+
const allRecords = [...records];
|
|
89
|
+
allRecords[index] = updatedRecord;
|
|
90
|
+
if (!dryRun) {
|
|
91
|
+
await writeSourceFile(sourceData.filePath, allRecords, isArray);
|
|
92
|
+
}
|
|
93
|
+
return { record: updatedRecord, allRecords };
|
|
94
|
+
}
|
|
95
|
+
async function removeRecord(sourceData, id, dryRun = false) {
|
|
96
|
+
const { records, isArray } = await readSourceFile(sourceData.filePath);
|
|
97
|
+
const targetIndex = records.findIndex((r) => r.id === id);
|
|
98
|
+
if (targetIndex < 0) {
|
|
99
|
+
throw new Error(`Resource with id "${id}" not found`);
|
|
100
|
+
}
|
|
101
|
+
const idsToRemove = new Set(getDescendantIds(records, id));
|
|
102
|
+
const removed = records.filter((r) => idsToRemove.has(r.id));
|
|
103
|
+
const allRecords = records.filter((r) => !idsToRemove.has(r.id));
|
|
104
|
+
if (!dryRun) {
|
|
105
|
+
await writeSourceFile(sourceData.filePath, allRecords, isArray);
|
|
106
|
+
}
|
|
107
|
+
return { removed, allRecords };
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=json-file-mutator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-file-mutator.js","sourceRoot":"","sources":["../../src/utils/json-file-mutator.ts"],"names":[],"mappings":"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"}
|