@ldsg/cli 0.3.29 → 0.3.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/.rush/temp/package-deps_build.json +22 -5
  2. package/.tsbuildinfo +1 -1
  3. package/CHANGELOG.json +52 -0
  4. package/CHANGELOG.md +15 -1
  5. package/dist/__tests__/commands.test.d.ts +1 -0
  6. package/dist/__tests__/commands.test.js +219 -0
  7. package/dist/__tests__/commands.test.js.map +1 -0
  8. package/dist/__tests__/formatter.test.d.ts +1 -0
  9. package/dist/__tests__/formatter.test.js +114 -0
  10. package/dist/__tests__/formatter.test.js.map +1 -0
  11. package/dist/__tests__/json-file-mutator.test.d.ts +1 -0
  12. package/dist/__tests__/json-file-mutator.test.js +103 -0
  13. package/dist/__tests__/json-file-mutator.test.js.map +1 -0
  14. package/dist/__tests__/source-resolver.test.d.ts +1 -0
  15. package/dist/__tests__/source-resolver.test.js +101 -0
  16. package/dist/__tests__/source-resolver.test.js.map +1 -0
  17. package/dist/cli.js +304 -0
  18. package/dist/cli.js.map +1 -1
  19. package/dist/commands/resource/convert.d.ts +11 -0
  20. package/dist/commands/resource/convert.js +42 -0
  21. package/dist/commands/resource/convert.js.map +1 -0
  22. package/dist/commands/resource/create.d.ts +14 -0
  23. package/dist/commands/resource/create.js +37 -0
  24. package/dist/commands/resource/create.js.map +1 -0
  25. package/dist/commands/resource/delete.d.ts +10 -0
  26. package/dist/commands/resource/delete.js +10 -0
  27. package/dist/commands/resource/delete.js.map +1 -0
  28. package/dist/commands/resource/diff.d.ts +10 -0
  29. package/dist/commands/resource/diff.js +72 -0
  30. package/dist/commands/resource/diff.js.map +1 -0
  31. package/dist/commands/resource/get.d.ts +6 -0
  32. package/dist/commands/resource/get.js +6 -0
  33. package/dist/commands/resource/get.js.map +1 -0
  34. package/dist/commands/resource/list.d.ts +30 -0
  35. package/dist/commands/resource/list.js +138 -0
  36. package/dist/commands/resource/list.js.map +1 -0
  37. package/dist/commands/resource/tree.d.ts +2 -0
  38. package/dist/commands/resource/tree.js +6 -0
  39. package/dist/commands/resource/tree.js.map +1 -0
  40. package/dist/commands/resource/update.d.ts +11 -0
  41. package/dist/commands/resource/update.js +13 -0
  42. package/dist/commands/resource/update.js.map +1 -0
  43. package/dist/constants.d.ts +2 -0
  44. package/dist/constants.js +3 -1
  45. package/dist/constants.js.map +1 -1
  46. package/dist/types/resource-record.d.ts +43 -0
  47. package/dist/types/resource-record.js +3 -0
  48. package/dist/types/resource-record.js.map +1 -0
  49. package/dist/utils/formatter.d.ts +12 -0
  50. package/dist/utils/formatter.js +96 -0
  51. package/dist/utils/formatter.js.map +1 -0
  52. package/dist/utils/json-file-mutator.d.ts +15 -0
  53. package/dist/utils/json-file-mutator.js +109 -0
  54. package/dist/utils/json-file-mutator.js.map +1 -0
  55. package/dist/utils/source-resolver.d.ts +4 -0
  56. package/dist/utils/source-resolver.js +93 -0
  57. package/dist/utils/source-resolver.js.map +1 -0
  58. package/jest.config.js +12 -0
  59. package/package.json +8 -6
  60. package/src/__tests__/commands.test.ts +262 -0
  61. package/src/__tests__/formatter.test.ts +133 -0
  62. package/src/__tests__/json-file-mutator.test.ts +136 -0
  63. package/src/__tests__/source-resolver.test.ts +125 -0
  64. package/src/cli.ts +309 -1
  65. package/src/commands/resource/convert.ts +52 -0
  66. package/src/commands/resource/create.ts +49 -0
  67. package/src/commands/resource/delete.ts +15 -0
  68. package/src/commands/resource/diff.ts +104 -0
  69. package/src/commands/resource/get.ts +5 -0
  70. package/src/commands/resource/list.ts +161 -0
  71. package/src/commands/resource/tree.ts +4 -0
  72. package/src/commands/resource/update.ts +21 -0
  73. package/src/constants.ts +3 -0
  74. package/src/types/resource-record.ts +52 -0
  75. package/src/utils/formatter.ts +106 -0
  76. package/src/utils/json-file-mutator.ts +137 -0
  77. 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
+ import { getResource } from './list';
2
+ export { getResource };
3
+ export type GetOptions = {
4
+ children?: boolean;
5
+ tree?: boolean;
6
+ };
@@ -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,2 @@
1
+ import { getTree } from './list';
2
+ export { getTree };
@@ -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"}
@@ -1 +1,3 @@
1
1
  export declare const DEFAULT_OUTPUT_PATH = ".";
2
+ export declare const DEFAULT_SOURCE_FILE = "resource-records.json";
3
+ export declare const DEFAULT_SOURCE_PATH = "./resource-records.json";
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
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=resource-record.js.map
@@ -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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"}