@cyberismo/data-handler 0.0.18 → 0.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/command-handler.d.ts +2 -0
- package/dist/command-handler.js +26 -2
- package/dist/command-handler.js.map +1 -1
- package/dist/command-manager.d.ts +2 -0
- package/dist/command-manager.js +3 -0
- package/dist/command-manager.js.map +1 -1
- package/dist/commands/create.d.ts +3 -1
- package/dist/commands/create.js +10 -1
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/migrate.d.ts +33 -0
- package/dist/commands/migrate.js +66 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/containers/project/card-cache.js +13 -1
- package/dist/containers/project/card-cache.js.map +1 -1
- package/dist/containers/project/project-paths.d.ts +1 -0
- package/dist/containers/project/project-paths.js +5 -2
- package/dist/containers/project/project-paths.js.map +1 -1
- package/dist/containers/project.d.ts +10 -0
- package/dist/containers/project.js +39 -2
- package/dist/containers/project.js.map +1 -1
- package/dist/containers/template.js +2 -0
- package/dist/containers/template.js.map +1 -1
- package/dist/interfaces/command-options.d.ts +6 -1
- package/dist/interfaces/project-interfaces.d.ts +4 -0
- package/dist/interfaces/project-interfaces.js.map +1 -1
- package/dist/migrations/index.d.ts +14 -0
- package/dist/migrations/index.js +14 -0
- package/dist/migrations/index.js.map +1 -0
- package/dist/migrations/migration-executor.d.ts +79 -0
- package/dist/migrations/migration-executor.js +312 -0
- package/dist/migrations/migration-executor.js.map +1 -0
- package/dist/migrations/migration-worker.d.ts +13 -0
- package/dist/migrations/migration-worker.js +156 -0
- package/dist/migrations/migration-worker.js.map +1 -0
- package/dist/migrations/worker-executor.d.ts +24 -0
- package/dist/migrations/worker-executor.js +157 -0
- package/dist/migrations/worker-executor.js.map +1 -0
- package/dist/project-settings.d.ts +2 -0
- package/dist/project-settings.js +7 -0
- package/dist/project-settings.js.map +1 -1
- package/dist/resources/calculation-resource.d.ts +9 -0
- package/dist/resources/calculation-resource.js +13 -2
- package/dist/resources/calculation-resource.js.map +1 -1
- package/dist/resources/card-type-resource.d.ts +7 -2
- package/dist/resources/card-type-resource.js +13 -13
- package/dist/resources/card-type-resource.js.map +1 -1
- package/dist/resources/field-type-resource.d.ts +5 -0
- package/dist/resources/field-type-resource.js +13 -7
- package/dist/resources/field-type-resource.js.map +1 -1
- package/dist/resources/file-resource.d.ts +13 -1
- package/dist/resources/file-resource.js +17 -8
- package/dist/resources/file-resource.js.map +1 -1
- package/dist/resources/graph-model-resource.d.ts +5 -0
- package/dist/resources/graph-model-resource.js +6 -0
- package/dist/resources/graph-model-resource.js.map +1 -1
- package/dist/resources/graph-view-resource.d.ts +5 -0
- package/dist/resources/graph-view-resource.js +6 -0
- package/dist/resources/graph-view-resource.js.map +1 -1
- package/dist/resources/link-type-resource.d.ts +6 -0
- package/dist/resources/link-type-resource.js +26 -0
- package/dist/resources/link-type-resource.js.map +1 -1
- package/dist/resources/report-resource.d.ts +6 -1
- package/dist/resources/report-resource.js +7 -1
- package/dist/resources/report-resource.js.map +1 -1
- package/dist/resources/resource-object.d.ts +22 -7
- package/dist/resources/resource-object.js +44 -15
- package/dist/resources/resource-object.js.map +1 -1
- package/dist/resources/template-resource.d.ts +5 -1
- package/dist/resources/template-resource.js +6 -1
- package/dist/resources/template-resource.js.map +1 -1
- package/dist/resources/workflow-resource.d.ts +6 -2
- package/dist/resources/workflow-resource.js +11 -6
- package/dist/resources/workflow-resource.js.map +1 -1
- package/dist/utils/card-utils.d.ts +1 -1
- package/dist/utils/common-utils.d.ts +8 -0
- package/dist/utils/common-utils.js +14 -0
- package/dist/utils/common-utils.js.map +1 -1
- package/dist/utils/file-utils.d.ts +15 -3
- package/dist/utils/file-utils.js +48 -9
- package/dist/utils/file-utils.js.map +1 -1
- package/dist/utils/json.js +2 -2
- package/dist/utils/json.js.map +1 -1
- package/package.json +5 -3
- package/src/command-handler.ts +38 -1
- package/src/command-manager.ts +3 -0
- package/src/commands/create.ts +11 -0
- package/src/commands/migrate.ts +88 -0
- package/src/containers/project/card-cache.ts +18 -1
- package/src/containers/project/project-paths.ts +6 -2
- package/src/containers/project.ts +66 -1
- package/src/containers/template.ts +5 -0
- package/src/interfaces/command-options.ts +8 -0
- package/src/interfaces/project-interfaces.ts +4 -0
- package/src/migrations/index.ts +20 -0
- package/src/migrations/migration-executor.ts +478 -0
- package/src/migrations/migration-worker.ts +190 -0
- package/src/migrations/worker-executor.ts +185 -0
- package/src/project-settings.ts +7 -0
- package/src/resources/calculation-resource.ts +13 -2
- package/src/resources/card-type-resource.ts +19 -14
- package/src/resources/field-type-resource.ts +18 -7
- package/src/resources/file-resource.ts +25 -8
- package/src/resources/graph-model-resource.ts +6 -0
- package/src/resources/graph-view-resource.ts +6 -0
- package/src/resources/link-type-resource.ts +34 -0
- package/src/resources/report-resource.ts +7 -1
- package/src/resources/resource-object.ts +57 -18
- package/src/resources/template-resource.ts +6 -1
- package/src/resources/workflow-resource.ts +17 -7
- package/src/utils/common-utils.ts +15 -0
- package/src/utils/file-utils.ts +56 -12
- package/src/utils/json.ts +2 -6
|
@@ -21,20 +21,24 @@ import type { ResourceName } from '../utils/resource-utils.js';
|
|
|
21
21
|
* Workflow resource class.
|
|
22
22
|
*/
|
|
23
23
|
export declare class WorkflowResource extends FileResource<Workflow> {
|
|
24
|
+
/**
|
|
25
|
+
* Creates an instance of WorkflowResource
|
|
26
|
+
* @param project Project to use
|
|
27
|
+
* @param name Resource name
|
|
28
|
+
*/
|
|
24
29
|
constructor(project: Project, name: ResourceName);
|
|
25
30
|
private collectCardsUsingWorkflow;
|
|
26
31
|
protected onNameChange(existingName: string): Promise<void>;
|
|
27
32
|
private handleStateChange;
|
|
28
33
|
private handleStateRemoval;
|
|
34
|
+
private isStringOperation;
|
|
29
35
|
private targetName;
|
|
30
36
|
private transitionObject;
|
|
31
|
-
private isStringOperation;
|
|
32
37
|
private updateCardStates;
|
|
33
38
|
private updateCardTypes;
|
|
34
39
|
/**
|
|
35
40
|
* Sets new metadata into the workflow object.
|
|
36
41
|
* @param newContent metadata content for the workflow.
|
|
37
|
-
* @throws if 'newContent' is not valid.
|
|
38
42
|
*/
|
|
39
43
|
create(newContent?: Workflow): Promise<void>;
|
|
40
44
|
/**
|
|
@@ -19,6 +19,11 @@ import { sortCards } from '../utils/card-utils.js';
|
|
|
19
19
|
* Workflow resource class.
|
|
20
20
|
*/
|
|
21
21
|
export class WorkflowResource extends FileResource {
|
|
22
|
+
/**
|
|
23
|
+
* Creates an instance of WorkflowResource
|
|
24
|
+
* @param project Project to use
|
|
25
|
+
* @param name Resource name
|
|
26
|
+
*/
|
|
22
27
|
constructor(project, name) {
|
|
23
28
|
super(project, name, 'workflows');
|
|
24
29
|
this.contentSchemaId = 'workflowSchema';
|
|
@@ -30,7 +35,7 @@ export class WorkflowResource extends FileResource {
|
|
|
30
35
|
const promises = [];
|
|
31
36
|
for (const cardType of cardTypes) {
|
|
32
37
|
if (cardType.data?.workflow === resourceNameToString(this.resourceName)) {
|
|
33
|
-
promises.push(this.collectCards(cardType.data.name));
|
|
38
|
+
promises.push(this.collectCards(cardType.data.name, (card, cardTypeName) => card.metadata?.cardType === cardTypeName));
|
|
34
39
|
}
|
|
35
40
|
}
|
|
36
41
|
return (await Promise.all(promises)).flat();
|
|
@@ -40,6 +45,7 @@ export class WorkflowResource extends FileResource {
|
|
|
40
45
|
await Promise.all([
|
|
41
46
|
super.updateHandleBars(existingName, this.content.name),
|
|
42
47
|
super.updateCalculations(existingName, this.content.name),
|
|
48
|
+
super.updateCardContentReferences(existingName, this.content.name),
|
|
43
49
|
this.updateCardTypes(existingName),
|
|
44
50
|
]);
|
|
45
51
|
// Finally, write updated content.
|
|
@@ -95,6 +101,10 @@ export class WorkflowResource extends FileResource {
|
|
|
95
101
|
await this.updateCardStates(stateName, replacementState.name);
|
|
96
102
|
}
|
|
97
103
|
}
|
|
104
|
+
// Check if operation is a string operation.
|
|
105
|
+
isStringOperation(op) {
|
|
106
|
+
return typeof op.target === 'string';
|
|
107
|
+
}
|
|
98
108
|
// Returns target name irregardless of the type
|
|
99
109
|
targetName(op) {
|
|
100
110
|
const name = op.target.name ? op.target.name : op.target;
|
|
@@ -121,10 +131,6 @@ export class WorkflowResource extends FileResource {
|
|
|
121
131
|
}
|
|
122
132
|
return op.to;
|
|
123
133
|
}
|
|
124
|
-
// Check if operation is a string operation.
|
|
125
|
-
isStringOperation(op) {
|
|
126
|
-
return typeof op.target === 'string';
|
|
127
|
-
}
|
|
128
134
|
// Update card states when state is changed
|
|
129
135
|
async updateCardStates(oldState, newState) {
|
|
130
136
|
const cards = await this.collectCardsUsingWorkflow();
|
|
@@ -156,7 +162,6 @@ export class WorkflowResource extends FileResource {
|
|
|
156
162
|
/**
|
|
157
163
|
* Sets new metadata into the workflow object.
|
|
158
164
|
* @param newContent metadata content for the workflow.
|
|
159
|
-
* @throws if 'newContent' is not valid.
|
|
160
165
|
*/
|
|
161
166
|
async create(newContent) {
|
|
162
167
|
if (!newContent) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-resource.js","sourceRoot":"","sources":["../../src/resources/workflow-resource.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;EAYE;AAQF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAWnD;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,YAAsB;IAC1D,YAAY,OAAgB,EAAE,IAAkB;QAC9C,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QAElC,IAAI,CAAC,eAAe,GAAG,gBAAgB,CAAC;QACxC,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACxE,CAAC;IAED,4CAA4C;IACpC,KAAK,CAAC,yBAAyB;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAsB,EAAE,CAAC;QACvC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,QAAQ,CAAC,IAAI,EAAE,QAAQ,KAAK,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBACxE,QAAQ,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"workflow-resource.js","sourceRoot":"","sources":["../../src/resources/workflow-resource.ts"],"names":[],"mappings":"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"}
|
|
@@ -87,4 +87,4 @@ export declare function parentCard(cardPath: string): string | undefined;
|
|
|
87
87
|
* @param b Second card to be sorted
|
|
88
88
|
* @returns Cards ordered; first by prefixes, then by ID.
|
|
89
89
|
*/
|
|
90
|
-
export declare const sortCards: (a: string, b: string) =>
|
|
90
|
+
export declare const sortCards: (a: string, b: string) => 1 | -1 | 0;
|
|
@@ -22,3 +22,11 @@ export declare function deepCompare(arg1: object, arg2: object): boolean;
|
|
|
22
22
|
* @returns true, if 'value' can be represented as BigInt; false otherwise.
|
|
23
23
|
*/
|
|
24
24
|
export declare function isBigInt(value: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Removes the first occurrence of a value from an array.
|
|
27
|
+
* Modifies the array in place.
|
|
28
|
+
* @param array The array to modify
|
|
29
|
+
* @param value The value to remove
|
|
30
|
+
* @returns The modified array (same reference as input)
|
|
31
|
+
*/
|
|
32
|
+
export declare function removeValue<T>(array: T[], value: T): T[];
|
|
@@ -44,4 +44,18 @@ export function isBigInt(value) {
|
|
|
44
44
|
return false;
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Removes the first occurrence of a value from an array.
|
|
49
|
+
* Modifies the array in place.
|
|
50
|
+
* @param array The array to modify
|
|
51
|
+
* @param value The value to remove
|
|
52
|
+
* @returns The modified array (same reference as input)
|
|
53
|
+
*/
|
|
54
|
+
export function removeValue(array, value) {
|
|
55
|
+
const index = array.findIndex((element) => element === value);
|
|
56
|
+
if (index !== -1) {
|
|
57
|
+
array.splice(index, 1);
|
|
58
|
+
}
|
|
59
|
+
return array;
|
|
60
|
+
}
|
|
47
61
|
//# sourceMappingURL=common-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common-utils.js","sourceRoot":"","sources":["../../src/utils/common-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;EAUE;AAEF;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,IAAY;IACpD,IACE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QACpC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EACpC,CAAC;QACD,IACE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,iBAAiB;YAC1D,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,gBAAgB,EACzD,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;gBAC1D,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG;gBAC1C,OAAO,WAAW,CAChB,IAAI,CAAC,GAAwB,CAAC,EAC9B,IAAI,CAAC,GAAwB,CAAC,CAC/B,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,KAAK,IAAI,CAAC;IACvB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"common-utils.js","sourceRoot":"","sources":["../../src/utils/common-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;EAUE;AAEF;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,IAAY;IACpD,IACE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QACpC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EACpC,CAAC;QACD,IACE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,iBAAiB;YAC1D,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,gBAAgB,EACzD,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;gBAC1D,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG;gBAC1C,OAAO,WAAW,CAChB,IAAI,CAAC,GAAwB,CAAC,EAC9B,IAAI,CAAC,GAAwB,CAAC,CAC/B,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,KAAK,IAAI,CAAC;IACvB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAI,KAAU,EAAE,KAAQ;IACjD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC;IAC9D,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -13,10 +13,11 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { writeFile } from 'node:fs/promises';
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
16
|
+
* Get available disk space for a given path.
|
|
17
|
+
* @param path Path to check
|
|
18
|
+
* @returns Available space in bytes
|
|
18
19
|
*/
|
|
19
|
-
export declare function
|
|
20
|
+
export declare function availableSpace(path: string): Promise<number>;
|
|
20
21
|
/**
|
|
21
22
|
* Copies directory content (subdirectories and files) to destination.
|
|
22
23
|
* Note that it won't create 'source', but copies all that is inside of 'source'.
|
|
@@ -35,6 +36,12 @@ export declare function deleteDir(path: string): Promise<void>;
|
|
|
35
36
|
* @returns true, if file was deleted; false otherwise.
|
|
36
37
|
*/
|
|
37
38
|
export declare function deleteFile(path: string): Promise<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* Calculate the total size of a directory recursively.
|
|
41
|
+
* @param dirPath Path to directory
|
|
42
|
+
* @returns Size in bytes
|
|
43
|
+
*/
|
|
44
|
+
export declare function folderSize(dirPath: string): Promise<number>;
|
|
38
45
|
/**
|
|
39
46
|
* Removes extension from filename.
|
|
40
47
|
* @param filename Filename
|
|
@@ -67,3 +74,8 @@ export declare function resolveTilde(filePath: string): string;
|
|
|
67
74
|
* Path separator RE.
|
|
68
75
|
*/
|
|
69
76
|
export declare const sepRegex: RegExp;
|
|
77
|
+
/**
|
|
78
|
+
* Works like the writeFile method, but ensures that the directory exists
|
|
79
|
+
* There is only one difference: This method only supports a string as the filePath
|
|
80
|
+
*/
|
|
81
|
+
export declare function writeFileSafe(filePath: string, data: Parameters<typeof writeFile>[1], options?: Parameters<typeof writeFile>[2]): Promise<void>;
|
package/dist/utils/file-utils.js
CHANGED
|
@@ -11,20 +11,23 @@
|
|
|
11
11
|
You should have received a copy of the GNU Affero General Public
|
|
12
12
|
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
13
13
|
*/
|
|
14
|
-
import { copyFile, mkdir, readdir, rm, unlink, writeFile, } from 'node:fs/promises';
|
|
14
|
+
import { copyFile, mkdir, readdir, rm, stat, statfs, unlink, writeFile, } from 'node:fs/promises';
|
|
15
15
|
import { existsSync, readdirSync } from 'node:fs';
|
|
16
16
|
import { dirname, join, sep } from 'node:path';
|
|
17
17
|
import { homedir } from 'node:os';
|
|
18
18
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
19
|
+
* Get available disk space for a given path.
|
|
20
|
+
* @param path Path to check
|
|
21
|
+
* @returns Available space in bytes
|
|
21
22
|
*/
|
|
22
|
-
export async function
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
|
|
23
|
+
export async function availableSpace(path) {
|
|
24
|
+
try {
|
|
25
|
+
const stats = await statfs(path);
|
|
26
|
+
return stats.bavail * stats.bsize;
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
throw new Error(`Failed to check available disk space: ${error}`);
|
|
30
|
+
}
|
|
28
31
|
}
|
|
29
32
|
/**
|
|
30
33
|
* Copies directory content (subdirectories and files) to destination.
|
|
@@ -72,6 +75,31 @@ export async function deleteFile(path) {
|
|
|
72
75
|
}
|
|
73
76
|
return true;
|
|
74
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Calculate the total size of a directory recursively.
|
|
80
|
+
* @param dirPath Path to directory
|
|
81
|
+
* @returns Size in bytes
|
|
82
|
+
*/
|
|
83
|
+
export async function folderSize(dirPath) {
|
|
84
|
+
let size = 0;
|
|
85
|
+
try {
|
|
86
|
+
const entries = await readdir(dirPath, { withFileTypes: true });
|
|
87
|
+
for (const entry of entries) {
|
|
88
|
+
const fullPath = join(dirPath, entry.name);
|
|
89
|
+
if (entry.isDirectory()) {
|
|
90
|
+
size += await folderSize(fullPath);
|
|
91
|
+
}
|
|
92
|
+
else if (entry.isFile()) {
|
|
93
|
+
const stats = await stat(fullPath);
|
|
94
|
+
size += stats.size;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Ignore permission errors or missing directories
|
|
100
|
+
}
|
|
101
|
+
return size;
|
|
102
|
+
}
|
|
75
103
|
/**
|
|
76
104
|
* Removes extension from filename.
|
|
77
105
|
* @param filename Filename
|
|
@@ -155,4 +183,15 @@ export function resolveTilde(filePath) {
|
|
|
155
183
|
* Path separator RE.
|
|
156
184
|
*/
|
|
157
185
|
export const sepRegex = /[/\\]/;
|
|
186
|
+
/**
|
|
187
|
+
* Works like the writeFile method, but ensures that the directory exists
|
|
188
|
+
* There is only one difference: This method only supports a string as the filePath
|
|
189
|
+
*/
|
|
190
|
+
export async function writeFileSafe(filePath, data, options) {
|
|
191
|
+
const dir = dirname(filePath);
|
|
192
|
+
await mkdir(dir, {
|
|
193
|
+
recursive: true,
|
|
194
|
+
});
|
|
195
|
+
return writeFile(filePath, data, options);
|
|
196
|
+
}
|
|
158
197
|
//# sourceMappingURL=file-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;EAYE;AAEF,OAAO,EACL,QAAQ,EACR,KAAK,EACL,OAAO,EACP,EAAE,EACF,MAAM,EACN,SAAS,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC
|
|
1
|
+
{"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/json.js
CHANGED
|
@@ -27,7 +27,7 @@ export function readJsonFileSync(file) {
|
|
|
27
27
|
}
|
|
28
28
|
catch (error) {
|
|
29
29
|
if (error instanceof Error) {
|
|
30
|
-
throw new Error(`
|
|
30
|
+
throw new Error(`Invalid JSON in file '${file}': ${error.message}`);
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
}
|
|
@@ -44,7 +44,7 @@ export async function readJsonFile(file) {
|
|
|
44
44
|
}
|
|
45
45
|
catch (error) {
|
|
46
46
|
if (error instanceof Error) {
|
|
47
|
-
throw new Error(`
|
|
47
|
+
throw new Error(`Invalid JSON in file '${file}': ${error.message}`);
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
}
|
package/dist/utils/json.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;EAYE;AAEF,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAmB,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAExE;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAClE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,WAAW,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;EAYE;AAEF,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAmB,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAExE;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAClE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,WAAW,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACtD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,aAAa,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,CAAS,EAAE,KAAc;IACpD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAA6B,EAC7B,IAAY,EACZ,OAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;IAC9D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cyberismo/data-handler",
|
|
3
3
|
"description": "Command handler for cards and web service",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.19",
|
|
5
5
|
"author": "sami.merila@cyberismo.com",
|
|
6
6
|
"license": "AGPL-3.0",
|
|
7
7
|
"homepage": "https://github.com/CyberismoCom/cyberismo",
|
|
@@ -46,8 +46,9 @@
|
|
|
46
46
|
"vega": "^6.2.0",
|
|
47
47
|
"vega-lite": "^6.4.1",
|
|
48
48
|
"write-json-file": "^7.0.0",
|
|
49
|
-
"@cyberismo/assets": "0.0.
|
|
50
|
-
"@cyberismo/node-clingo": "1.3.3"
|
|
49
|
+
"@cyberismo/assets": "0.0.19",
|
|
50
|
+
"@cyberismo/node-clingo": "1.3.3",
|
|
51
|
+
"@cyberismo/migrations": "0.0.19"
|
|
51
52
|
},
|
|
52
53
|
"type": "module",
|
|
53
54
|
"files": [
|
|
@@ -58,6 +59,7 @@
|
|
|
58
59
|
"build": "tsc -p tsconfig.build.json",
|
|
59
60
|
"clean": "rm -rf node_modules",
|
|
60
61
|
"lint": "eslint .",
|
|
62
|
+
"pretest": "pnpm build",
|
|
61
63
|
"posttest": "pnpm lint",
|
|
62
64
|
"test": "mocha --require mocha-suppress-logs --disable-warning=ExperimentalWarning --forbid-only \"./test/**/*.test.ts\"",
|
|
63
65
|
"test-coverage": "c8 pnpm test",
|
package/src/command-handler.ts
CHANGED
|
@@ -38,6 +38,7 @@ import type {
|
|
|
38
38
|
CalcCommandOptions,
|
|
39
39
|
ExportCommandOptions,
|
|
40
40
|
ImportCommandOptions,
|
|
41
|
+
MigrateCommandOptions,
|
|
41
42
|
ReportCommandOptions,
|
|
42
43
|
ShowCommandOptions,
|
|
43
44
|
StartCommandOptions,
|
|
@@ -70,6 +71,7 @@ export const Cmd = {
|
|
|
70
71
|
export: 'export',
|
|
71
72
|
fetch: 'fetch',
|
|
72
73
|
import: 'import',
|
|
74
|
+
migrate: 'migrate',
|
|
73
75
|
move: 'move',
|
|
74
76
|
rank: 'rank',
|
|
75
77
|
remove: 'remove',
|
|
@@ -272,11 +274,15 @@ export class Commands {
|
|
|
272
274
|
const [name] = rest;
|
|
273
275
|
await this.commands?.createCmd.createLinkType(name);
|
|
274
276
|
} else if (target === 'project') {
|
|
275
|
-
|
|
277
|
+
// 3rd parameter - path - is skipped it is used in general command handling
|
|
278
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
279
|
+
const [name, prefix, _, category, description] = rest;
|
|
276
280
|
await Create.createProject(
|
|
277
281
|
resolveTilde(this.projectPath),
|
|
278
282
|
prefix,
|
|
279
283
|
name,
|
|
284
|
+
category || '',
|
|
285
|
+
description || '',
|
|
280
286
|
);
|
|
281
287
|
} else if (target === 'report') {
|
|
282
288
|
const [name] = rest;
|
|
@@ -323,6 +329,12 @@ export class Commands {
|
|
|
323
329
|
const [csvFile, cardKey] = args;
|
|
324
330
|
return await this.importCsv(csvFile, cardKey);
|
|
325
331
|
}
|
|
332
|
+
} else if (command === Cmd.migrate) {
|
|
333
|
+
const [toVersion] = args;
|
|
334
|
+
return await this.migrate(
|
|
335
|
+
toVersion ? parseInt(toVersion, 10) : undefined,
|
|
336
|
+
options as MigrateCommandOptions,
|
|
337
|
+
);
|
|
326
338
|
} else if (command === Cmd.move) {
|
|
327
339
|
const [source, destination] = args;
|
|
328
340
|
await this.commands?.moveCmd.moveCard(source, destination);
|
|
@@ -848,6 +860,31 @@ export class Commands {
|
|
|
848
860
|
return { statusCode: 200 };
|
|
849
861
|
}
|
|
850
862
|
|
|
863
|
+
// Run migrations to bring project to target schema version
|
|
864
|
+
private async migrate(
|
|
865
|
+
toVersion?: number,
|
|
866
|
+
options?: { backup?: string; timeout?: number },
|
|
867
|
+
): Promise<requestStatus> {
|
|
868
|
+
if (!this.commands) {
|
|
869
|
+
return { statusCode: 500, message: 'Commands not initialized' };
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
const timeout = options?.timeout;
|
|
873
|
+
try {
|
|
874
|
+
const result = await this.commands.migrateCmd.migrate(
|
|
875
|
+
toVersion,
|
|
876
|
+
options?.backup,
|
|
877
|
+
timeout,
|
|
878
|
+
);
|
|
879
|
+
return {
|
|
880
|
+
statusCode: 200,
|
|
881
|
+
message: result.message || 'Migration completed successfully',
|
|
882
|
+
};
|
|
883
|
+
} catch (e) {
|
|
884
|
+
return { statusCode: 500, message: errorFunction(e) };
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
|
|
851
888
|
// Validates that a given path conforms to schema. Validates both file/folder structure and file content.
|
|
852
889
|
private async validate(): Promise<requestStatus> {
|
|
853
890
|
if (!this.commands) {
|
package/src/command-manager.ts
CHANGED
|
@@ -16,6 +16,7 @@ import { Edit } from './commands/edit.js';
|
|
|
16
16
|
import { Export } from './commands/export.js';
|
|
17
17
|
import { Fetch } from './commands/fetch.js';
|
|
18
18
|
import { Import } from './commands/import.js';
|
|
19
|
+
import { Migrate } from './commands/migrate.js';
|
|
19
20
|
import { Move } from './commands/move.js';
|
|
20
21
|
import { Remove } from './commands/remove.js';
|
|
21
22
|
import { Rename } from './commands/rename.js';
|
|
@@ -45,6 +46,7 @@ export class CommandManager {
|
|
|
45
46
|
public exportCmd: Export;
|
|
46
47
|
public fetchCmd: Fetch;
|
|
47
48
|
public importCmd: Import;
|
|
49
|
+
public migrateCmd: Migrate;
|
|
48
50
|
public moveCmd: Move;
|
|
49
51
|
public removeCmd: Remove;
|
|
50
52
|
public renameCmd: Rename;
|
|
@@ -69,6 +71,7 @@ export class CommandManager {
|
|
|
69
71
|
this.editCmd = new Edit(this.project);
|
|
70
72
|
this.exportCmd = new Export(this.project, this.showCmd);
|
|
71
73
|
this.importCmd = new Import(this.project, this.createCmd, this.fetchCmd);
|
|
74
|
+
this.migrateCmd = new Migrate(this.project);
|
|
72
75
|
this.moveCmd = new Move(this.project);
|
|
73
76
|
this.removeCmd = new Remove(this.project, this.fetchCmd);
|
|
74
77
|
this.renameCmd = new Rename(this.project);
|
package/src/commands/create.ts
CHANGED
|
@@ -48,6 +48,7 @@ export class Create {
|
|
|
48
48
|
schemaVersion: SCHEMA_VERSION,
|
|
49
49
|
cardKeyPrefix: '$PROJECT-PREFIX',
|
|
50
50
|
name: '$PROJECT-NAME',
|
|
51
|
+
description: '',
|
|
51
52
|
modules: [],
|
|
52
53
|
hubs: [],
|
|
53
54
|
},
|
|
@@ -372,11 +373,15 @@ export class Create {
|
|
|
372
373
|
* @param projectPath where to create the project.
|
|
373
374
|
* @param projectPrefix prefix for the project.
|
|
374
375
|
* @param projectName name for the project.
|
|
376
|
+
* @param projectCategory category for the project (empty string if not provided).
|
|
377
|
+
* @param projectDescription description for the project (empty string if not provided).
|
|
375
378
|
*/
|
|
376
379
|
public static async createProject(
|
|
377
380
|
projectPath: string,
|
|
378
381
|
projectPrefix: string,
|
|
379
382
|
projectName: string,
|
|
383
|
+
projectCategory: string,
|
|
384
|
+
projectDescription: string,
|
|
380
385
|
) {
|
|
381
386
|
projectPath = resolve(projectPath);
|
|
382
387
|
|
|
@@ -439,6 +444,12 @@ export class Create {
|
|
|
439
444
|
if (entry.content.name.includes('$PROJECT-NAME')) {
|
|
440
445
|
entry.content.name = projectName;
|
|
441
446
|
}
|
|
447
|
+
if (projectCategory) {
|
|
448
|
+
entry.content.category = projectCategory;
|
|
449
|
+
}
|
|
450
|
+
if (projectDescription) {
|
|
451
|
+
entry.content.description = projectDescription;
|
|
452
|
+
}
|
|
442
453
|
}
|
|
443
454
|
await writeJsonFile(
|
|
444
455
|
join(projectPath, entry.path, entry.name),
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
Cyberismo
|
|
3
|
+
Copyright © Cyberismo Ltd and contributors 2025
|
|
4
|
+
This program is free software: you can redistribute it and/or modify it under
|
|
5
|
+
the terms of the GNU Affero General Public License version 3 as published by
|
|
6
|
+
the Free Software Foundation.
|
|
7
|
+
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
8
|
+
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
9
|
+
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
10
|
+
details. You should have received a copy of the GNU Affero General Public
|
|
11
|
+
License along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { SCHEMA_VERSION } from '@cyberismo/assets';
|
|
15
|
+
import type { MigrationResult } from '@cyberismo/migrations';
|
|
16
|
+
import type { Project } from '../containers/project.js';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Command that handles schema migration operations.
|
|
20
|
+
*/
|
|
21
|
+
export class Migrate {
|
|
22
|
+
/**
|
|
23
|
+
* Constructs instance of Migrate command.
|
|
24
|
+
* @param project Project instance to use.
|
|
25
|
+
*/
|
|
26
|
+
constructor(private project: Project) {}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Run migrations to bring project to target schema version.
|
|
30
|
+
* @param toVersion Target version (defaults to latest)
|
|
31
|
+
* @param backupDir Optional directory for backups
|
|
32
|
+
* @param timeoutMilliSeconds Optional timeout in milliseconds (defaults to 2 minutes)
|
|
33
|
+
* @returns Migration result
|
|
34
|
+
*/
|
|
35
|
+
public async migrate(
|
|
36
|
+
toVersion?: number,
|
|
37
|
+
backupDir?: string,
|
|
38
|
+
timeoutMilliSeconds?: number,
|
|
39
|
+
): Promise<MigrationResult> {
|
|
40
|
+
const currentVersion = this.project.configuration.schemaVersion;
|
|
41
|
+
if (currentVersion === undefined) {
|
|
42
|
+
throw new Error('Project has no schema version set');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const targetVersion = toVersion ?? SCHEMA_VERSION;
|
|
46
|
+
|
|
47
|
+
// Prevent downgrading
|
|
48
|
+
if (targetVersion < currentVersion) {
|
|
49
|
+
throw new Error(
|
|
50
|
+
`Cannot downgrade from version ${currentVersion} to ${targetVersion}. Downgrading is not supported.`,
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Cannot migrate beyond current application schema
|
|
55
|
+
if (targetVersion > SCHEMA_VERSION) {
|
|
56
|
+
throw new Error(
|
|
57
|
+
`Cannot migrate to version ${targetVersion}. Current application supports up to version ${SCHEMA_VERSION}.`,
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// No migration needed
|
|
62
|
+
if (currentVersion === targetVersion) {
|
|
63
|
+
return {
|
|
64
|
+
success: true,
|
|
65
|
+
message: `Project is already at version ${currentVersion}. No migration needed.`,
|
|
66
|
+
stepsExecuted: [],
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Prevent skipping migrations when a specific target version is provided
|
|
71
|
+
// If no version specified, migrate to the latest
|
|
72
|
+
if (toVersion !== undefined && toVersion !== SCHEMA_VERSION) {
|
|
73
|
+
// Only allow next sequential version
|
|
74
|
+
if (targetVersion !== currentVersion + 1) {
|
|
75
|
+
throw new Error(
|
|
76
|
+
`Cannot skip to version ${targetVersion}. Project is at version ${currentVersion}, next version is ${currentVersion + 1}. Migrate one version at a time with 'cyberismo migrate ${currentVersion + 1}', or use 'cyberismo migrate' (without a version) to migrate to the latest version.`,
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return await this.project.runMigrations(
|
|
82
|
+
currentVersion,
|
|
83
|
+
targetVersion,
|
|
84
|
+
backupDir,
|
|
85
|
+
timeoutMilliSeconds,
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -162,13 +162,30 @@ export class CardCache {
|
|
|
162
162
|
this.fetchAttachments(currentPath),
|
|
163
163
|
]);
|
|
164
164
|
|
|
165
|
+
let metadata;
|
|
166
|
+
try {
|
|
167
|
+
metadata = JSON.parse(cardMetadata);
|
|
168
|
+
} catch (error) {
|
|
169
|
+
const metadataPath = join(currentPath, cardMetadataFile);
|
|
170
|
+
CardCache.logger.error(
|
|
171
|
+
{ error, metadataPath },
|
|
172
|
+
`Incorrect card metadata file`,
|
|
173
|
+
);
|
|
174
|
+
if (error instanceof Error) {
|
|
175
|
+
throw new Error(
|
|
176
|
+
`Invalid JSON in file '${metadataPath}': ${error.message}`,
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
throw error;
|
|
180
|
+
}
|
|
181
|
+
|
|
165
182
|
return {
|
|
166
183
|
key: entry.name,
|
|
167
184
|
path: currentPath,
|
|
168
185
|
children: [],
|
|
169
186
|
attachments: Array.isArray(cardAttachments) ? cardAttachments : [],
|
|
170
187
|
content: typeof cardContent === 'string' ? cardContent : '',
|
|
171
|
-
metadata:
|
|
188
|
+
metadata: metadata,
|
|
172
189
|
parent: parentCard(currentPath),
|
|
173
190
|
location: location,
|
|
174
191
|
};
|