@cyberismo/data-handler 0.0.18 → 0.0.20

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 (134) hide show
  1. package/dist/command-handler.d.ts +2 -0
  2. package/dist/command-handler.js +31 -3
  3. package/dist/command-handler.js.map +1 -1
  4. package/dist/command-manager.d.ts +2 -0
  5. package/dist/command-manager.js +3 -0
  6. package/dist/command-manager.js.map +1 -1
  7. package/dist/commands/create.d.ts +3 -1
  8. package/dist/commands/create.js +10 -1
  9. package/dist/commands/create.js.map +1 -1
  10. package/dist/commands/migrate.d.ts +33 -0
  11. package/dist/commands/migrate.js +66 -0
  12. package/dist/commands/migrate.js.map +1 -0
  13. package/dist/containers/project/card-cache.js +13 -1
  14. package/dist/containers/project/card-cache.js.map +1 -1
  15. package/dist/containers/project/project-paths.d.ts +1 -0
  16. package/dist/containers/project/project-paths.js +5 -2
  17. package/dist/containers/project/project-paths.js.map +1 -1
  18. package/dist/containers/project.d.ts +10 -0
  19. package/dist/containers/project.js +39 -2
  20. package/dist/containers/project.js.map +1 -1
  21. package/dist/containers/template.js +2 -0
  22. package/dist/containers/template.js.map +1 -1
  23. package/dist/interfaces/command-options.d.ts +6 -1
  24. package/dist/interfaces/project-interfaces.d.ts +4 -0
  25. package/dist/interfaces/project-interfaces.js.map +1 -1
  26. package/dist/macros/include/index.js +3 -1
  27. package/dist/macros/include/index.js.map +1 -1
  28. package/dist/macros/include/types.d.ts +6 -0
  29. package/dist/migrations/index.d.ts +14 -0
  30. package/dist/migrations/index.js +14 -0
  31. package/dist/migrations/index.js.map +1 -0
  32. package/dist/migrations/migration-executor.d.ts +79 -0
  33. package/dist/migrations/migration-executor.js +312 -0
  34. package/dist/migrations/migration-executor.js.map +1 -0
  35. package/dist/migrations/migration-worker.d.ts +13 -0
  36. package/dist/migrations/migration-worker.js +156 -0
  37. package/dist/migrations/migration-worker.js.map +1 -0
  38. package/dist/migrations/worker-executor.d.ts +24 -0
  39. package/dist/migrations/worker-executor.js +157 -0
  40. package/dist/migrations/worker-executor.js.map +1 -0
  41. package/dist/project-settings.d.ts +2 -0
  42. package/dist/project-settings.js +7 -0
  43. package/dist/project-settings.js.map +1 -1
  44. package/dist/resources/calculation-resource.d.ts +9 -0
  45. package/dist/resources/calculation-resource.js +13 -2
  46. package/dist/resources/calculation-resource.js.map +1 -1
  47. package/dist/resources/card-type-resource.d.ts +7 -2
  48. package/dist/resources/card-type-resource.js +13 -13
  49. package/dist/resources/card-type-resource.js.map +1 -1
  50. package/dist/resources/create-defaults.js +1 -1
  51. package/dist/resources/create-defaults.js.map +1 -1
  52. package/dist/resources/field-type-resource.d.ts +5 -0
  53. package/dist/resources/field-type-resource.js +23 -10
  54. package/dist/resources/field-type-resource.js.map +1 -1
  55. package/dist/resources/file-resource.d.ts +13 -1
  56. package/dist/resources/file-resource.js +17 -8
  57. package/dist/resources/file-resource.js.map +1 -1
  58. package/dist/resources/folder-resource.js +20 -8
  59. package/dist/resources/folder-resource.js.map +1 -1
  60. package/dist/resources/graph-model-resource.d.ts +5 -0
  61. package/dist/resources/graph-model-resource.js +6 -0
  62. package/dist/resources/graph-model-resource.js.map +1 -1
  63. package/dist/resources/graph-view-resource.d.ts +5 -0
  64. package/dist/resources/graph-view-resource.js +6 -0
  65. package/dist/resources/graph-view-resource.js.map +1 -1
  66. package/dist/resources/link-type-resource.d.ts +6 -0
  67. package/dist/resources/link-type-resource.js +26 -0
  68. package/dist/resources/link-type-resource.js.map +1 -1
  69. package/dist/resources/report-resource.d.ts +6 -1
  70. package/dist/resources/report-resource.js +7 -1
  71. package/dist/resources/report-resource.js.map +1 -1
  72. package/dist/resources/resource-object.d.ts +22 -7
  73. package/dist/resources/resource-object.js +44 -15
  74. package/dist/resources/resource-object.js.map +1 -1
  75. package/dist/resources/template-resource.d.ts +5 -1
  76. package/dist/resources/template-resource.js +6 -1
  77. package/dist/resources/template-resource.js.map +1 -1
  78. package/dist/resources/workflow-resource.d.ts +6 -2
  79. package/dist/resources/workflow-resource.js +11 -6
  80. package/dist/resources/workflow-resource.js.map +1 -1
  81. package/dist/svg/percentage.js +7 -3
  82. package/dist/svg/percentage.js.map +1 -1
  83. package/dist/svg/scoreCard.js +10 -4
  84. package/dist/svg/scoreCard.js.map +1 -1
  85. package/dist/types/queries.d.ts +1 -1
  86. package/dist/utils/card-utils.d.ts +1 -1
  87. package/dist/utils/common-utils.d.ts +8 -0
  88. package/dist/utils/common-utils.js +14 -0
  89. package/dist/utils/common-utils.js.map +1 -1
  90. package/dist/utils/file-utils.d.ts +15 -3
  91. package/dist/utils/file-utils.js +48 -9
  92. package/dist/utils/file-utils.js.map +1 -1
  93. package/dist/utils/json.js +2 -2
  94. package/dist/utils/json.js.map +1 -1
  95. package/dist/utils/resource-utils.js +1 -0
  96. package/dist/utils/resource-utils.js.map +1 -1
  97. package/package.json +7 -5
  98. package/src/command-handler.ts +42 -2
  99. package/src/command-manager.ts +3 -0
  100. package/src/commands/create.ts +11 -0
  101. package/src/commands/migrate.ts +88 -0
  102. package/src/containers/project/card-cache.ts +18 -1
  103. package/src/containers/project/project-paths.ts +6 -2
  104. package/src/containers/project.ts +66 -1
  105. package/src/containers/template.ts +5 -0
  106. package/src/interfaces/command-options.ts +8 -0
  107. package/src/interfaces/project-interfaces.ts +4 -0
  108. package/src/macros/include/index.ts +3 -1
  109. package/src/macros/include/types.ts +6 -0
  110. package/src/migrations/index.ts +20 -0
  111. package/src/migrations/migration-executor.ts +478 -0
  112. package/src/migrations/migration-worker.ts +190 -0
  113. package/src/migrations/worker-executor.ts +185 -0
  114. package/src/project-settings.ts +7 -0
  115. package/src/resources/calculation-resource.ts +13 -2
  116. package/src/resources/card-type-resource.ts +19 -14
  117. package/src/resources/create-defaults.ts +1 -1
  118. package/src/resources/field-type-resource.ts +31 -13
  119. package/src/resources/file-resource.ts +25 -8
  120. package/src/resources/folder-resource.ts +21 -7
  121. package/src/resources/graph-model-resource.ts +6 -0
  122. package/src/resources/graph-view-resource.ts +6 -0
  123. package/src/resources/link-type-resource.ts +34 -0
  124. package/src/resources/report-resource.ts +7 -1
  125. package/src/resources/resource-object.ts +57 -18
  126. package/src/resources/template-resource.ts +6 -1
  127. package/src/resources/workflow-resource.ts +17 -7
  128. package/src/svg/percentage.ts +7 -3
  129. package/src/svg/scoreCard.ts +10 -4
  130. package/src/types/queries.ts +1 -1
  131. package/src/utils/common-utils.ts +15 -0
  132. package/src/utils/file-utils.ts +56 -12
  133. package/src/utils/json.ts +2 -6
  134. package/src/utils/resource-utils.ts +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"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"}
@@ -27,7 +27,7 @@ export function readJsonFileSync(file) {
27
27
  }
28
28
  catch (error) {
29
29
  if (error instanceof Error) {
30
- throw new Error(`Error while handling JSON file '${file}' : ${error.message}`);
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(`Error while handling JSON file '${file}' : ${error.message}`);
47
+ throw new Error(`Invalid JSON in file '${file}': ${error.message}`);
48
48
  }
49
49
  }
50
50
  }
@@ -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,CACb,mCAAmC,IAAI,OAAO,KAAK,CAAC,OAAO,EAAE,CAC9D,CAAC;QACJ,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,CACb,mCAAmC,IAAI,OAAO,KAAK,CAAC,OAAO,EAAE,CAC9D,CAAC;QACJ,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"}
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"}
@@ -16,6 +16,7 @@ const IDENTIFIER_INDEX = 2;
16
16
  // Valid resource name has three parts
17
17
  const RESOURCE_NAME_PARTS = 3;
18
18
  const RESOURCE_FOLDER_TYPES = [
19
+ 'calculations',
19
20
  'graphModels',
20
21
  'graphViews',
21
22
  'reports',
@@ -1 +1 @@
1
- {"version":3,"file":"resource-utils.js","sourceRoot":"","sources":["../../src/utils/resource-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resource-utils.js","sourceRoot":"","sources":["../../src/utils/resource-utils.ts"],"names":[],"mappings":"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"}
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.18",
4
+ "version": "0.0.20",
5
5
  "author": "sami.merila@cyberismo.com",
6
6
  "license": "AGPL-3.0",
7
7
  "homepage": "https://github.com/CyberismoCom/cyberismo",
@@ -22,7 +22,7 @@
22
22
  "@types/json-schema": "^7.0.15",
23
23
  "@types/sinon": "^21.0.0",
24
24
  "c8": "^10.1.3",
25
- "pino-pretty": "^13.1.2",
25
+ "pino-pretty": "^13.1.3",
26
26
  "sinon": "^21.0.0"
27
27
  },
28
28
  "dependencies": {
@@ -32,7 +32,7 @@
32
32
  "async-mutex": "^0.5.0",
33
33
  "csv-parse": "^6.1.0",
34
34
  "directory-schema-validator": "^1.0.17",
35
- "dompurify": "^3.3.0",
35
+ "dompurify": "^3.3.1",
36
36
  "email-validator": "^2.0.4",
37
37
  "handlebars": "^4.7.8",
38
38
  "jsdom": "^27.0.0",
@@ -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.18",
50
- "@cyberismo/node-clingo": "1.3.3"
49
+ "@cyberismo/assets": "0.0.20",
50
+ "@cyberismo/migrations": "0.0.20",
51
+ "@cyberismo/node-clingo": "1.3.4"
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",
@@ -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',
@@ -257,7 +259,10 @@ export class Commands {
257
259
  } else if (target === 'graphView') {
258
260
  const [name] = rest;
259
261
  await this.commands?.createCmd.createGraphView(name);
260
- } else if (target == 'label') {
262
+ } else if (target === 'calculation') {
263
+ const [name] = rest;
264
+ await this.commands?.createCmd.createCalculation(name);
265
+ } else if (target === 'label') {
261
266
  const [cardKey, label] = rest;
262
267
  await this.commands?.createCmd.createLabel(cardKey, label);
263
268
  } else if (target === 'link') {
@@ -272,11 +277,15 @@ export class Commands {
272
277
  const [name] = rest;
273
278
  await this.commands?.createCmd.createLinkType(name);
274
279
  } else if (target === 'project') {
275
- const [name, prefix] = rest;
280
+ // 3rd parameter - path - is skipped it is used in general command handling
281
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
282
+ const [name, prefix, _, category, description] = rest;
276
283
  await Create.createProject(
277
284
  resolveTilde(this.projectPath),
278
285
  prefix,
279
286
  name,
287
+ category || '',
288
+ description || '',
280
289
  );
281
290
  } else if (target === 'report') {
282
291
  const [name] = rest;
@@ -323,6 +332,12 @@ export class Commands {
323
332
  const [csvFile, cardKey] = args;
324
333
  return await this.importCsv(csvFile, cardKey);
325
334
  }
335
+ } else if (command === Cmd.migrate) {
336
+ const [toVersion] = args;
337
+ return await this.migrate(
338
+ toVersion ? parseInt(toVersion, 10) : undefined,
339
+ options as MigrateCommandOptions,
340
+ );
326
341
  } else if (command === Cmd.move) {
327
342
  const [source, destination] = args;
328
343
  await this.commands?.moveCmd.moveCard(source, destination);
@@ -848,6 +863,31 @@ export class Commands {
848
863
  return { statusCode: 200 };
849
864
  }
850
865
 
866
+ // Run migrations to bring project to target schema version
867
+ private async migrate(
868
+ toVersion?: number,
869
+ options?: { backup?: string; timeout?: number },
870
+ ): Promise<requestStatus> {
871
+ if (!this.commands) {
872
+ return { statusCode: 500, message: 'Commands not initialized' };
873
+ }
874
+
875
+ const timeout = options?.timeout;
876
+ try {
877
+ const result = await this.commands.migrateCmd.migrate(
878
+ toVersion,
879
+ options?.backup,
880
+ timeout,
881
+ );
882
+ return {
883
+ statusCode: 200,
884
+ message: result.message || 'Migration completed successfully',
885
+ };
886
+ } catch (e) {
887
+ return { statusCode: 500, message: errorFunction(e) };
888
+ }
889
+ }
890
+
851
891
  // Validates that a given path conforms to schema. Validates both file/folder structure and file content.
852
892
  private async validate(): Promise<requestStatus> {
853
893
  if (!this.commands) {
@@ -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);
@@ -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: JSON.parse(cardMetadata),
188
+ metadata: metadata,
172
189
  parent: parentCard(currentPath),
173
190
  location: location,
174
191
  };
@@ -80,6 +80,10 @@ export class ProjectPaths {
80
80
  return join(this.resourcesFolder, 'graphViews');
81
81
  }
82
82
 
83
+ public get internalRootFolder(): string {
84
+ return join(this.path, '.cards');
85
+ }
86
+
83
87
  public get linkTypesFolder(): string {
84
88
  return join(this.resourcesFolder, 'linkTypes');
85
89
  }
@@ -93,7 +97,7 @@ export class ProjectPaths {
93
97
  }
94
98
 
95
99
  public get modulesFolder(): string {
96
- return join(this.path, '.cards', 'modules');
100
+ return join(this.internalRootFolder, 'modules');
97
101
  }
98
102
 
99
103
  public moduleResourcePath(
@@ -105,7 +109,7 @@ export class ProjectPaths {
105
109
  }
106
110
 
107
111
  public get resourcesFolder(): string {
108
- return join(this.path, '.cards', 'local');
112
+ return join(this.internalRootFolder, 'local');
109
113
  }
110
114
 
111
115
  public get reportsFolder(): string {
@@ -55,7 +55,9 @@ import { ResourceHandler } from './project/resource-handler.js';
55
55
  import { Validate } from '../commands/validate.js';
56
56
  import { ContentWatcher } from './project/project-content-watcher.js';
57
57
  import { getChildLogger } from '../utils/log-utils.js';
58
+ import { MigrationExecutor } from '../migrations/migration-executor.js';
58
59
 
60
+ import type { MigrationResult } from '@cyberismo/migrations';
59
61
  import type { Template } from './template.js';
60
62
 
61
63
  import { ROOT } from '../utils/constants.js';
@@ -572,12 +574,27 @@ export class Project extends CardContainer {
572
574
  public async handleCardDeleted(deletedCard: Card) {
573
575
  // Delete children from the cache first
574
576
  if (deletedCard.children && deletedCard.children.length > 0) {
577
+ const parentCachedCard = this.cardCache.getCard(deletedCard.key);
578
+ const parentLocation = parentCachedCard?.location || 'project';
579
+
575
580
  for (const child of deletedCard.children) {
576
581
  try {
577
582
  const childCard = this.findCard(child);
583
+ const childCachedCard = this.cardCache.getCard(child);
584
+
585
+ // Safety check: only delete children from the same location (project or template)
586
+ if (childCachedCard && childCachedCard.location !== parentLocation) {
587
+ const errorMessage =
588
+ `Cannot delete child card '${child}' from different location '${childCachedCard.location}' ` +
589
+ `than parent card '${deletedCard.key}' from '${parentLocation}'`;
590
+ this.logger.error(errorMessage);
591
+ throw new Error(errorMessage);
592
+ }
593
+
578
594
  await this.handleCardDeleted(childCard);
579
- } catch {
595
+ } catch (error) {
580
596
  this.logger.warn(
597
+ { error },
581
598
  `Accessing child '${child}' of '${deletedCard.key}' when deleting cards caused an exception`,
582
599
  );
583
600
  continue;
@@ -753,6 +770,7 @@ export class Project extends CardContainer {
753
770
  );
754
771
  return {
755
772
  name: moduleConfig.name,
773
+ description: moduleConfig.description || '',
756
774
  modules: moduleConfig.modules,
757
775
  hubs: moduleConfig.hubs,
758
776
  path: modulePath,
@@ -970,6 +988,51 @@ export class Project extends CardContainer {
970
988
  return this.resourceHandler;
971
989
  }
972
990
 
991
+ /**
992
+ * Run migrations to bring project schema to target version.
993
+ * @param fromVersion Current schema version
994
+ * @param toVersion Target schema version
995
+ * @param backupDir Optional directory for backups. If undefined, no backup is created.
996
+ * @param timeoutMilliSeconds Optional timeout in milliseconds. If undefined, uses default (2 minutes).
997
+ * @returns Migration result
998
+ */
999
+ public async runMigrations(
1000
+ fromVersion: number,
1001
+ toVersion: number,
1002
+ backupDir?: string,
1003
+ timeoutMilliSeconds?: number,
1004
+ ): Promise<MigrationResult> {
1005
+ this.logger.info({ fromVersion, toVersion }, 'Starting schema migration');
1006
+
1007
+ const executor = new MigrationExecutor(
1008
+ this,
1009
+ backupDir,
1010
+ timeoutMilliSeconds,
1011
+ );
1012
+ const result = await executor.migrate(
1013
+ fromVersion,
1014
+ toVersion,
1015
+ async (version: number) => {
1016
+ this.settings.schemaVersion = version;
1017
+ await this.settings.save();
1018
+ },
1019
+ );
1020
+
1021
+ if (result.success) {
1022
+ this.logger.info(
1023
+ { fromVersion, toVersion },
1024
+ 'Migration completed successfully',
1025
+ );
1026
+ } else {
1027
+ this.logger.error(
1028
+ { error: result.error, message: result.message },
1029
+ 'Migration failed',
1030
+ );
1031
+ }
1032
+
1033
+ return result;
1034
+ }
1035
+
973
1036
  /**
974
1037
  * Shows details of a project.
975
1038
  * @returns details of a project.
@@ -979,6 +1042,8 @@ export class Project extends CardContainer {
979
1042
  name: this.settings.name,
980
1043
  path: this.basePath,
981
1044
  prefix: this.projectPrefix,
1045
+ category: this.configuration.category,
1046
+ description: this.configuration.description,
982
1047
  hubs: this.configuration.hubs,
983
1048
  modules: this.resources.moduleNames(),
984
1049
  numberOfCards: (await this.listCards(CardLocation.projectOnly))[0].cards
@@ -152,6 +152,11 @@ export class Template extends CardContainer {
152
152
 
153
153
  card.key = templateIDMap.get(card.key) || card.key;
154
154
 
155
+ // Remap children keys from template keys to new project card keys
156
+ card.children = card.children.map(
157
+ (childKey) => templateIDMap.get(childKey) || childKey,
158
+ );
159
+
155
160
  // Set parent field based on template hierarchy and creation location
156
161
  // Store the original template parent before key remapping
157
162
  const originalParentKey = card.parent;
@@ -60,6 +60,12 @@ export interface ImportCommandOptions extends BaseCommandOptions {
60
60
  skipMigrationLog?: boolean;
61
61
  }
62
62
 
63
+ // Options for 'migrate' command
64
+ export interface MigrateCommandOptions extends BaseCommandOptions {
65
+ backup?: string;
66
+ timeout?: number;
67
+ }
68
+
63
69
  // Options for 'move' command
64
70
  export type MoveCommandOptions = BaseCommandOptions;
65
71
 
@@ -111,6 +117,7 @@ export type AllCommandOptions =
111
117
  | ExportCommandOptions
112
118
  | FetchCommandOptions
113
119
  | ImportCommandOptions
120
+ | MigrateCommandOptions
114
121
  | MoveCommandOptions
115
122
  | RankCommandOptions
116
123
  | RemoveCommandOptions
@@ -132,6 +139,7 @@ export type CommandOptions<T extends CmdKey> = {
132
139
  export: ExportCommandOptions;
133
140
  fetch: FetchCommandOptions;
134
141
  import: ImportCommandOptions;
142
+ migrate: MigrateCommandOptions;
135
143
  move: MoveCommandOptions;
136
144
  rank: RankCommandOptions;
137
145
  remove: RemoveCommandOptions;
@@ -171,6 +171,8 @@ export interface ProjectMetadata {
171
171
  name: string;
172
172
  path: string;
173
173
  prefix: string;
174
+ category?: string;
175
+ description?: string;
174
176
  modules: string[];
175
177
  hubs: HubSetting[];
176
178
  numberOfCards: number;
@@ -181,6 +183,8 @@ export interface ProjectSettings {
181
183
  schemaVersion?: number;
182
184
  cardKeyPrefix: string;
183
185
  name: string;
186
+ category?: string;
187
+ description: string;
184
188
  modules: ModuleSetting[];
185
189
  hubs: HubSetting[];
186
190
  }
@@ -71,7 +71,9 @@ export default class IncludeMacro extends BaseMacro {
71
71
  levelOffset,
72
72
  options.pageTitles === 'discrete',
73
73
  );
74
- return adjustedContent;
74
+ return options.whitespace === 'trim'
75
+ ? adjustedContent.trim()
76
+ : adjustedContent;
75
77
  };
76
78
 
77
79
  private validate(input: unknown): IncludeMacroOptions {
@@ -29,4 +29,10 @@ export interface IncludeMacroOptions {
29
29
  */
30
30
  title?: 'include' | 'exclude' | 'only';
31
31
  pageTitles?: 'normal' | 'discrete';
32
+ /**
33
+ * Whether to trim initial and final whitespace and newlines from the output.
34
+ * Useful for generating non-AsciiDoc content such as JSON.
35
+ * Default is 'keep'.
36
+ */
37
+ whitespace?: 'keep' | 'trim';
32
38
  }
@@ -0,0 +1,20 @@
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
+ export { MigrationExecutor } from './migration-executor.js';
15
+ export type {
16
+ Migration,
17
+ MigrationContext,
18
+ MigrationResult,
19
+ MigrationStepResult,
20
+ } from '@cyberismo/migrations';