@ldsg/cli 0.3.29 → 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.
Files changed (77) hide show
  1. package/.rush/temp/package-deps_build.json +22 -5
  2. package/.tsbuildinfo +1 -1
  3. package/CHANGELOG.json +26 -0
  4. package/CHANGELOG.md +8 -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,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":";;AA4EA,sCAiBC;AAED,kCAmBC;AAED,0BA0CC;AAEQ,oCAAY;AAAE,4CAAgB;AAAE,wCAAc;AAAE,sCAAa;AAAE,8BAAS;AAAE,8BAAS;AA7J5F,SAAS,YAAY,CAAC,OAAwB,EAAE,IAAa;IAC3D,IAAI,CAAC,IAAI;QAAE,OAAO,OAAO,CAAC;IAC1B,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAwB,EAAE,QAAiB;IACnE,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC;IAChE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,gBAAgB,CAAC,UAA2B,EAAE,MAAc;IACnE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC9C,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC1B,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QAC7B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACf,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACxC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,OAAwB,EAAE,MAAe;IAC/D,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC;IAC5B,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,aAAa,CAAC,OAAwB;IAC7C,MAAM,GAAG,GAAG,IAAI,GAAG,EAA4B,CAAC;IAChD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACpC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,SAAS,CAAC,OAAwB;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;IAClF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7E,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,SAAS,CAChB,OAAwB,EACxB,MAAc;IAEd,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;IAClD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAExC,SAAS,YAAY,CAAC,MAAc;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QACrF,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACtC,CAAC;IAED,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAEM,KAAK,UAAU,aAAa,CACjC,OAAwB,EACxB,MAAsB;IAKtB,IAAI,MAAM,GAAG,OAAO,CAAC;IAErB,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAE/C,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM;QACpB,SAAS,EAAE,MAAM;KAClB,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,WAAW,CAC/B,OAAwB,EACxB,EAAU,EACV,OAA+C;IAE/C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACpC,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC;QAC1D,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC;IACjC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,OAAO,CAC3B,OAAwB,EACxB,MAAe,EACf,QAAkB;IAElB,IAAI,eAAe,GAAG,MAAM,CAAC;IAE7B,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,eAAe,GAAG,kBAAkB,CAAC;YACrC,MAAM,WAAW,GAAmB;gBAClC,EAAE,EAAE,kBAAkB;gBACtB,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,IAAI;gBACd,QAAQ,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE;aACpC,CAAC;YACF,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAE7E,OAAO;gBACL,MAAM,EAAE,eAAe;gBACvB,IAAI,EAAE;oBACJ,QAAQ,EAAE,WAAW;oBACrB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;iBACzC;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACjD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,qBAAqB,eAAe,aAAa,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;AAC3C,CAAC"}
@@ -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":";;;;;AA4DA,gCAIC;AAED,oCAmBC;AAED,oCA0BC;AAED,oCAqBC;AAxID,wDAA0B;AAI1B,SAAS,aAAa,CAAC,eAAgC;IACrD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IACrD,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC;QACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACzC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,eAAgC,EAAE,EAAU;IACpE,MAAM,QAAQ,GAAG,aAAa,CAAC,eAAe,CAAC,CAAC;IAChD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;IACnB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QACjC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpB,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC/C,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAa;IACtC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,EAAE,IAAuB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC7D,CAAC;IACD,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAA+B,CAAC;QAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YACvC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,eAAkC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC7E,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,eAAe,CAAC,OAAwB,EAAE,OAAgB;IACjE,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,QAAgB;IAC5C,MAAM,IAAI,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzC,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,OAAwB,EAAE,OAAgB;IACzF,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,SAAgB,UAAU;IACxB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,OAAO,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC;AAClC,CAAC;AAEM,KAAK,UAAU,YAAY,CAChC,UAAsB,EACtB,MAAsB,EACtB,MAAM,GAAG,KAAK;IAEd,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEvE,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;IACnE,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC;IAExC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,eAAe,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAChC,CAAC;AAEM,KAAK,UAAU,YAAY,CAChC,UAAsB,EACtB,EAAU,EACV,QAAiC,EACjC,MAAM,GAAG,KAAK;IAEd,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEvE,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,aAAa,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,aAAa,GAAmB;QACpC,GAAG,OAAO,CAAC,KAAK,CAAC;QACjB,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,GAAG,QAAQ,EAAE;KACtD,CAAC;IAEF,MAAM,UAAU,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAChC,UAAU,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC;IAElC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,eAAe,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AAC/C,CAAC;AAEM,KAAK,UAAU,YAAY,CAChC,UAAsB,EACtB,EAAU,EACV,MAAM,GAAG,KAAK;IAEd,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEvE,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,aAAa,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEjE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,eAAe,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACjC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { SourceData } from '../types/resource-record';
2
+ export declare function resolveSource(source?: string): Promise<SourceData>;
3
+ export declare function isStdinSource(source?: string): boolean;
4
+ export declare function getSourceDescription(source?: string): string;
@@ -0,0 +1,93 @@
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.resolveSource = resolveSource;
7
+ exports.isStdinSource = isStdinSource;
8
+ exports.getSourceDescription = getSourceDescription;
9
+ const fs_extra_1 = __importDefault(require("fs-extra"));
10
+ const constants_1 = require("../constants");
11
+ async function readJsonFile(filePath) {
12
+ if (!(await fs_extra_1.default.pathExists(filePath))) {
13
+ throw new Error(`File not found: ${filePath}`);
14
+ }
15
+ return fs_extra_1.default.readJson(filePath);
16
+ }
17
+ function parseResourceRecords(data) {
18
+ if (Array.isArray(data)) {
19
+ return { resourceRecords: data, format: 'array' };
20
+ }
21
+ if (data && typeof data === 'object') {
22
+ const obj = data;
23
+ if (Array.isArray(obj.resourceRecords)) {
24
+ return { resourceRecords: obj.resourceRecords, format: 'object' };
25
+ }
26
+ }
27
+ throw new Error('Invalid resource records format: expected an array or { resourceRecords: [] }');
28
+ }
29
+ async function resolveFile(filePath) {
30
+ const data = await readJsonFile(filePath);
31
+ const { resourceRecords, format } = parseResourceRecords(data);
32
+ return { resourceRecords, format, filePath };
33
+ }
34
+ async function resolveDirectory(dirPath) {
35
+ const filePath = `${dirPath.replace(/\/$/, '')}/${constants_1.DEFAULT_SOURCE_FILE}`;
36
+ return resolveFile(filePath);
37
+ }
38
+ async function resolveStdin() {
39
+ return new Promise((resolve, reject) => {
40
+ const chunks = [];
41
+ process.stdin.setEncoding('utf-8');
42
+ process.stdin.on('data', (chunk) => {
43
+ chunks.push(Buffer.from(chunk));
44
+ });
45
+ process.stdin.on('end', () => {
46
+ try {
47
+ const raw = Buffer.concat(chunks).toString('utf-8');
48
+ const data = JSON.parse(raw);
49
+ const { resourceRecords, format } = parseResourceRecords(data);
50
+ resolve({ resourceRecords, format, filePath: '-stdin-' });
51
+ }
52
+ catch (error) {
53
+ reject(new Error(`Failed to parse stdin as JSON: ${error.message}`));
54
+ }
55
+ });
56
+ process.stdin.on('error', (error) => {
57
+ reject(new Error(`Failed to read stdin: ${error.message}`));
58
+ });
59
+ });
60
+ }
61
+ async function resolveSource(source) {
62
+ if (!source || source === constants_1.DEFAULT_SOURCE_FILE) {
63
+ const defaultPath = `./${constants_1.DEFAULT_SOURCE_FILE}`;
64
+ if (await fs_extra_1.default.pathExists(defaultPath)) {
65
+ return resolveFile(defaultPath);
66
+ }
67
+ throw new Error(`Default source file not found: ${defaultPath}. Use --source to specify a file.`);
68
+ }
69
+ if (source === '-') {
70
+ return resolveStdin();
71
+ }
72
+ const stats = await fs_extra_1.default.stat(source).catch(() => null);
73
+ if (!stats) {
74
+ throw new Error(`Source not found: ${source}`);
75
+ }
76
+ if (stats.isDirectory()) {
77
+ return resolveDirectory(source);
78
+ }
79
+ return resolveFile(source);
80
+ }
81
+ function isStdinSource(source) {
82
+ return source === '-';
83
+ }
84
+ function getSourceDescription(source) {
85
+ if (!source || source === constants_1.DEFAULT_SOURCE_FILE) {
86
+ return `./${constants_1.DEFAULT_SOURCE_FILE}`;
87
+ }
88
+ if (source === '-') {
89
+ return 'stdin';
90
+ }
91
+ return source;
92
+ }
93
+ //# sourceMappingURL=source-resolver.js.map