@cyberismo/data-handler 0.0.14 → 0.0.16

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 (280) hide show
  1. package/dist/card-metadata-updater.js +8 -4
  2. package/dist/card-metadata-updater.js.map +1 -1
  3. package/dist/command-handler.d.ts +4 -0
  4. package/dist/command-handler.js +29 -19
  5. package/dist/command-handler.js.map +1 -1
  6. package/dist/command-manager.d.ts +25 -2
  7. package/dist/command-manager.js +30 -5
  8. package/dist/command-manager.js.map +1 -1
  9. package/dist/commands/create.d.ts +1 -1
  10. package/dist/commands/create.js +45 -93
  11. package/dist/commands/create.js.map +1 -1
  12. package/dist/commands/edit.d.ts +1 -15
  13. package/dist/commands/edit.js +15 -89
  14. package/dist/commands/edit.js.map +1 -1
  15. package/dist/commands/export.d.ts +11 -2
  16. package/dist/commands/export.js +58 -58
  17. package/dist/commands/export.js.map +1 -1
  18. package/dist/commands/import.d.ts +9 -1
  19. package/dist/commands/import.js +17 -11
  20. package/dist/commands/import.js.map +1 -1
  21. package/dist/commands/move.d.ts +1 -2
  22. package/dist/commands/move.js +107 -146
  23. package/dist/commands/move.js.map +1 -1
  24. package/dist/commands/remove.d.ts +8 -1
  25. package/dist/commands/remove.js +17 -48
  26. package/dist/commands/remove.js.map +1 -1
  27. package/dist/commands/rename.d.ts +4 -9
  28. package/dist/commands/rename.js +34 -108
  29. package/dist/commands/rename.js.map +1 -1
  30. package/dist/commands/show.d.ts +22 -34
  31. package/dist/commands/show.js +103 -151
  32. package/dist/commands/show.js.map +1 -1
  33. package/dist/commands/transition.d.ts +9 -2
  34. package/dist/commands/transition.js +49 -44
  35. package/dist/commands/transition.js.map +1 -1
  36. package/dist/commands/update.d.ts +18 -12
  37. package/dist/commands/update.js +34 -18
  38. package/dist/commands/update.js.map +1 -1
  39. package/dist/commands/validate.d.ts +18 -10
  40. package/dist/commands/validate.js +101 -47
  41. package/dist/commands/validate.js.map +1 -1
  42. package/dist/containers/card-container.d.ts +87 -24
  43. package/dist/containers/card-container.js +183 -279
  44. package/dist/containers/card-container.js.map +1 -1
  45. package/dist/containers/project/calculation-engine.d.ts +13 -4
  46. package/dist/containers/project/calculation-engine.js +79 -77
  47. package/dist/containers/project/calculation-engine.js.map +1 -1
  48. package/dist/containers/project/card-cache.d.ts +146 -0
  49. package/dist/containers/project/card-cache.js +411 -0
  50. package/dist/containers/project/card-cache.js.map +1 -0
  51. package/dist/containers/project/project-paths.d.ts +5 -4
  52. package/dist/containers/project/project-paths.js +16 -12
  53. package/dist/containers/project/project-paths.js.map +1 -1
  54. package/dist/containers/project/resource-cache.d.ts +169 -0
  55. package/dist/containers/project/resource-cache.js +507 -0
  56. package/dist/containers/project/resource-cache.js.map +1 -0
  57. package/dist/containers/project/resource-handler.d.ts +129 -0
  58. package/dist/containers/project/resource-handler.js +206 -0
  59. package/dist/containers/project/resource-handler.js.map +1 -0
  60. package/dist/containers/project.d.ts +114 -195
  61. package/dist/containers/project.js +425 -535
  62. package/dist/containers/project.js.map +1 -1
  63. package/dist/containers/template.d.ts +22 -32
  64. package/dist/containers/template.js +113 -115
  65. package/dist/containers/template.js.map +1 -1
  66. package/dist/index.d.ts +1 -0
  67. package/dist/index.js +1 -0
  68. package/dist/index.js.map +1 -1
  69. package/dist/interfaces/folder-content-interfaces.d.ts +7 -4
  70. package/dist/interfaces/folder-content-interfaces.js +3 -3
  71. package/dist/interfaces/folder-content-interfaces.js.map +1 -1
  72. package/dist/interfaces/macros.d.ts +1 -0
  73. package/dist/interfaces/macros.js +1 -1
  74. package/dist/interfaces/macros.js.map +1 -1
  75. package/dist/interfaces/project-interfaces.d.ts +7 -5
  76. package/dist/interfaces/project-interfaces.js.map +1 -1
  77. package/dist/interfaces/resource-interfaces.d.ts +25 -22
  78. package/dist/interfaces/resource-interfaces.js +3 -0
  79. package/dist/interfaces/resource-interfaces.js.map +1 -1
  80. package/dist/macros/common.d.ts +10 -10
  81. package/dist/macros/createCards/index.d.ts +0 -13
  82. package/dist/macros/createCards/index.js.map +1 -1
  83. package/dist/macros/createCards/types.d.ts +44 -0
  84. package/dist/macros/createCards/types.js +15 -0
  85. package/dist/macros/createCards/types.js.map +1 -0
  86. package/dist/macros/graph/index.d.ts +2 -6
  87. package/dist/macros/graph/index.js +14 -28
  88. package/dist/macros/graph/index.js.map +1 -1
  89. package/dist/macros/graph/types.d.ts +23 -0
  90. package/dist/macros/graph/types.js +15 -0
  91. package/dist/macros/graph/types.js.map +1 -0
  92. package/dist/macros/image/index.d.ts +8 -16
  93. package/dist/macros/image/index.js +36 -33
  94. package/dist/macros/image/index.js.map +1 -1
  95. package/dist/macros/image/types.d.ts +38 -0
  96. package/dist/macros/image/types.js +15 -0
  97. package/dist/macros/image/types.js.map +1 -0
  98. package/dist/macros/include/index.d.ts +1 -6
  99. package/dist/macros/include/index.js +4 -7
  100. package/dist/macros/include/index.js.map +1 -1
  101. package/dist/macros/include/types.d.ts +31 -0
  102. package/dist/macros/include/types.js +15 -0
  103. package/dist/macros/include/types.js.map +1 -0
  104. package/dist/macros/index.d.ts +1 -1
  105. package/dist/macros/index.js +2 -2
  106. package/dist/macros/index.js.map +1 -1
  107. package/dist/macros/percentage/index.d.ts +0 -6
  108. package/dist/macros/percentage/index.js.map +1 -1
  109. package/dist/macros/percentage/types.d.ts +31 -0
  110. package/dist/macros/percentage/types.js +15 -0
  111. package/dist/macros/percentage/types.js.map +1 -0
  112. package/dist/macros/report/index.d.ts +0 -3
  113. package/dist/macros/report/index.js +3 -6
  114. package/dist/macros/report/index.js.map +1 -1
  115. package/dist/macros/report/types.d.ts +19 -0
  116. package/dist/macros/report/types.js +15 -0
  117. package/dist/macros/report/types.js.map +1 -0
  118. package/dist/macros/scoreCard/index.d.ts +0 -6
  119. package/dist/macros/scoreCard/index.js.map +1 -1
  120. package/dist/macros/scoreCard/types.d.ts +31 -0
  121. package/dist/macros/scoreCard/types.js +15 -0
  122. package/dist/macros/scoreCard/types.js.map +1 -0
  123. package/dist/macros/types.d.ts +25 -0
  124. package/dist/macros/types.js +2 -0
  125. package/dist/macros/types.js.map +1 -0
  126. package/dist/macros/vega/index.d.ts +0 -4
  127. package/dist/macros/vega/index.js.map +1 -1
  128. package/dist/macros/vega/types.d.ts +20 -0
  129. package/dist/macros/vega/types.js +2 -0
  130. package/dist/macros/vega/types.js.map +1 -0
  131. package/dist/macros/vegalite/index.d.ts +0 -4
  132. package/dist/macros/vegalite/index.js.map +1 -1
  133. package/dist/macros/vegalite/types.d.ts +20 -0
  134. package/dist/macros/vegalite/types.js +15 -0
  135. package/dist/macros/vegalite/types.js.map +1 -0
  136. package/dist/macros/xref/index.d.ts +0 -3
  137. package/dist/macros/xref/index.js +5 -14
  138. package/dist/macros/xref/index.js.map +1 -1
  139. package/dist/macros/xref/types.d.ts +19 -0
  140. package/dist/macros/xref/types.js +15 -0
  141. package/dist/macros/xref/types.js.map +1 -0
  142. package/dist/module-manager.d.ts +16 -3
  143. package/dist/module-manager.js +55 -23
  144. package/dist/module-manager.js.map +1 -1
  145. package/dist/project-settings.d.ts +16 -3
  146. package/dist/project-settings.js +79 -14
  147. package/dist/project-settings.js.map +1 -1
  148. package/dist/resources/calculation-resource.d.ts +6 -33
  149. package/dist/resources/calculation-resource.js +11 -60
  150. package/dist/resources/calculation-resource.js.map +1 -1
  151. package/dist/resources/card-type-resource.d.ts +10 -22
  152. package/dist/resources/card-type-resource.js +46 -66
  153. package/dist/resources/card-type-resource.js.map +1 -1
  154. package/dist/resources/create-defaults.d.ts +3 -2
  155. package/dist/resources/create-defaults.js +3 -2
  156. package/dist/resources/create-defaults.js.map +1 -1
  157. package/dist/resources/field-type-resource.d.ts +8 -22
  158. package/dist/resources/field-type-resource.js +35 -60
  159. package/dist/resources/field-type-resource.js.map +1 -1
  160. package/dist/resources/file-resource.d.ts +14 -35
  161. package/dist/resources/file-resource.js +22 -301
  162. package/dist/resources/file-resource.js.map +1 -1
  163. package/dist/resources/folder-resource.d.ts +44 -66
  164. package/dist/resources/folder-resource.js +102 -149
  165. package/dist/resources/folder-resource.js.map +1 -1
  166. package/dist/resources/graph-model-resource.d.ts +9 -34
  167. package/dist/resources/graph-model-resource.js +18 -64
  168. package/dist/resources/graph-model-resource.js.map +1 -1
  169. package/dist/resources/graph-view-resource.d.ts +9 -29
  170. package/dist/resources/graph-view-resource.js +13 -48
  171. package/dist/resources/graph-view-resource.js.map +1 -1
  172. package/dist/resources/link-type-resource.d.ts +9 -23
  173. package/dist/resources/link-type-resource.js +11 -33
  174. package/dist/resources/link-type-resource.js.map +1 -1
  175. package/dist/resources/report-resource.d.ts +10 -23
  176. package/dist/resources/report-resource.js +20 -67
  177. package/dist/resources/report-resource.js.map +1 -1
  178. package/dist/resources/resource-object.d.ts +143 -23
  179. package/dist/resources/resource-object.js +369 -48
  180. package/dist/resources/resource-object.js.map +1 -1
  181. package/dist/resources/template-resource.d.ts +10 -17
  182. package/dist/resources/template-resource.js +19 -27
  183. package/dist/resources/template-resource.js.map +1 -1
  184. package/dist/resources/workflow-resource.d.ts +9 -25
  185. package/dist/resources/workflow-resource.js +25 -55
  186. package/dist/resources/workflow-resource.js.map +1 -1
  187. package/dist/utils/card-utils.d.ts +69 -19
  188. package/dist/utils/card-utils.js +179 -30
  189. package/dist/utils/card-utils.js.map +1 -1
  190. package/dist/utils/clingo-fact-builder.d.ts +25 -14
  191. package/dist/utils/clingo-fact-builder.js +27 -5
  192. package/dist/utils/clingo-fact-builder.js.map +1 -1
  193. package/dist/utils/clingo-facts.js +14 -7
  194. package/dist/utils/clingo-facts.js.map +1 -1
  195. package/dist/utils/clingo-parser.js +1 -1
  196. package/dist/utils/clingo-parser.js.map +1 -1
  197. package/dist/utils/constants.d.ts +2 -0
  198. package/dist/utils/constants.js +4 -0
  199. package/dist/utils/constants.js.map +1 -1
  200. package/dist/utils/csv.js +1 -1
  201. package/dist/utils/csv.js.map +1 -1
  202. package/dist/utils/resource-utils.d.ts +1 -0
  203. package/dist/utils/resource-utils.js +2 -1
  204. package/dist/utils/resource-utils.js.map +1 -1
  205. package/package.json +11 -11
  206. package/src/card-metadata-updater.ts +9 -7
  207. package/src/command-handler.ts +35 -23
  208. package/src/command-manager.ts +32 -19
  209. package/src/commands/create.ts +59 -160
  210. package/src/commands/edit.ts +16 -132
  211. package/src/commands/export.ts +71 -81
  212. package/src/commands/import.ts +26 -18
  213. package/src/commands/move.ts +143 -179
  214. package/src/commands/remove.ts +20 -59
  215. package/src/commands/rename.ts +45 -156
  216. package/src/commands/show.ts +153 -211
  217. package/src/commands/transition.ts +53 -58
  218. package/src/commands/update.ts +44 -23
  219. package/src/commands/validate.ts +108 -82
  220. package/src/containers/card-container.ts +200 -360
  221. package/src/containers/project/calculation-engine.ts +81 -105
  222. package/src/containers/project/card-cache.ts +497 -0
  223. package/src/containers/project/project-paths.ts +21 -13
  224. package/src/containers/project/resource-cache.ts +648 -0
  225. package/src/containers/project/resource-handler.ts +265 -0
  226. package/src/containers/project.ts +551 -693
  227. package/src/containers/template.ts +129 -142
  228. package/src/index.ts +1 -0
  229. package/src/interfaces/folder-content-interfaces.ts +14 -7
  230. package/src/interfaces/macros.ts +2 -0
  231. package/src/interfaces/project-interfaces.ts +14 -7
  232. package/src/interfaces/resource-interfaces.ts +30 -27
  233. package/src/macros/createCards/index.ts +1 -12
  234. package/src/macros/createCards/types.ts +46 -0
  235. package/src/macros/graph/index.ts +27 -52
  236. package/src/macros/graph/types.ts +24 -0
  237. package/src/macros/image/index.ts +50 -61
  238. package/src/macros/image/types.ts +39 -0
  239. package/src/macros/include/index.ts +6 -15
  240. package/src/macros/include/types.ts +32 -0
  241. package/src/macros/index.ts +2 -2
  242. package/src/macros/percentage/index.ts +1 -7
  243. package/src/macros/percentage/types.ts +32 -0
  244. package/src/macros/report/index.ts +4 -13
  245. package/src/macros/report/types.ts +20 -0
  246. package/src/macros/scoreCard/index.ts +1 -7
  247. package/src/macros/scoreCard/types.ts +32 -0
  248. package/src/macros/types.ts +48 -0
  249. package/src/macros/vega/index.ts +1 -4
  250. package/src/macros/vega/types.ts +21 -0
  251. package/src/macros/vegalite/index.ts +1 -4
  252. package/src/macros/vegalite/types.ts +22 -0
  253. package/src/macros/xref/index.ts +6 -20
  254. package/src/macros/xref/types.ts +20 -0
  255. package/src/module-manager.ts +79 -22
  256. package/src/project-settings.ts +84 -15
  257. package/src/resources/calculation-resource.ts +21 -91
  258. package/src/resources/card-type-resource.ts +74 -109
  259. package/src/resources/create-defaults.ts +3 -2
  260. package/src/resources/field-type-resource.ts +61 -104
  261. package/src/resources/file-resource.ts +33 -441
  262. package/src/resources/folder-resource.ts +130 -207
  263. package/src/resources/graph-model-resource.ts +36 -95
  264. package/src/resources/graph-view-resource.ts +28 -70
  265. package/src/resources/link-type-resource.ts +23 -53
  266. package/src/resources/report-resource.ts +34 -96
  267. package/src/resources/resource-object.ts +511 -66
  268. package/src/resources/template-resource.ts +32 -44
  269. package/src/resources/workflow-resource.ts +42 -85
  270. package/src/utils/card-utils.ts +217 -31
  271. package/src/utils/clingo-fact-builder.ts +28 -16
  272. package/src/utils/clingo-facts.ts +16 -7
  273. package/src/utils/clingo-parser.ts +1 -1
  274. package/src/utils/constants.ts +6 -0
  275. package/src/utils/csv.ts +1 -1
  276. package/src/utils/resource-utils.ts +2 -1
  277. package/dist/containers/project/resource-collector.d.ts +0 -87
  278. package/dist/containers/project/resource-collector.js +0 -337
  279. package/dist/containers/project/resource-collector.js.map +0 -1
  280. package/src/containers/project/resource-collector.ts +0 -396
@@ -12,42 +12,38 @@
12
12
  License along with this program. If not, see <https://www.gnu.org/licenses/>.
13
13
  */
14
14
 
15
- import { readdir } from 'node:fs/promises';
16
15
  import { extname, join } from 'node:path';
16
+ import { readdir } from 'node:fs/promises';
17
17
 
18
+ import { copyDir } from '../utils/file-utils.js';
19
+ import { DefaultContent } from './create-defaults.js';
20
+ import { FolderResource } from './folder-resource.js';
21
+ import { getStaticDirectoryPath } from '@cyberismo/assets';
22
+ import { resourceNameToString } from '../utils/resource-utils.js';
23
+ import { sortCards } from '../utils/card-utils.js';
24
+
25
+ import type { Card } from '../interfaces/project-interfaces.js';
26
+ import type { GraphViewContent } from '../interfaces/folder-content-interfaces.js';
18
27
  import type {
19
- Card,
20
- Operation,
21
- Project,
22
- ResourceName,
23
- } from './folder-resource.js';
24
- import {
25
- DefaultContent,
26
- FolderResource,
27
- resourceNameToString,
28
- sortCards,
29
- } from './folder-resource.js';
30
- import type {
31
- GraphView,
32
28
  GraphViewMetadata,
33
- GraphViewUpdateKey,
29
+ UpdateKey,
34
30
  } from '../interfaces/resource-interfaces.js';
35
- import type { GraphViewContent } from '../interfaces/folder-content-interfaces.js';
36
-
37
- import { getStaticDirectoryPath } from '@cyberismo/assets';
38
- import { copyDir } from '../utils/file-utils.js';
31
+ import type { Operation } from './resource-object.js';
32
+ import type { Project } from '../containers/project.js';
33
+ import type { ResourceName } from '../utils/resource-utils.js';
39
34
 
40
35
  /**
41
36
  * Graph view resource class.
42
37
  */
43
- export class GraphViewResource extends FolderResource {
38
+ export class GraphViewResource extends FolderResource<
39
+ GraphViewMetadata,
40
+ GraphViewContent
41
+ > {
44
42
  constructor(project: Project, name: ResourceName) {
45
43
  super(project, name, 'graphViews');
46
44
 
47
45
  this.contentSchemaId = 'graphViewSchema';
48
46
  this.contentSchema = super.contentSchemaContent(this.contentSchemaId);
49
-
50
- this.initialize();
51
47
  }
52
48
 
53
49
  /**
@@ -83,20 +79,8 @@ export class GraphViewResource extends FolderResource {
83
79
  join(await getStaticDirectoryPath(), 'defaultGraphView'),
84
80
  this.internalFolder,
85
81
  );
86
- }
87
-
88
- /**
89
- * Returns resource content.
90
- */
91
- public get data(): GraphView {
92
- return super.data as GraphView;
93
- }
94
82
 
95
- /**
96
- * Deletes file and folder that this resource is based on.
97
- */
98
- public async delete() {
99
- return super.delete();
83
+ await this.loadContentFiles();
100
84
  }
101
85
 
102
86
  /**
@@ -125,33 +109,24 @@ export class GraphViewResource extends FolderResource {
125
109
  return this.onNameChange(existingName);
126
110
  }
127
111
 
128
- /**
129
- * Shows metadata of the resource.
130
- * @returns graph view metadata.
131
- */
132
- public async show(): Promise<GraphView> {
133
- const baseData = (await super.show()) as GraphViewMetadata;
134
- return {
135
- ...baseData,
136
- content: (await super.contentData()) as GraphViewContent,
137
- };
138
- }
139
-
140
112
  /**
141
113
  * Updates graph view resource.
142
- * @param key Key to modify
114
+ * @param updateKey Key to modify
143
115
  * @param op Operation to perform on 'key'
144
116
  */
145
- public async update<Type>(key: GraphViewUpdateKey, op: Operation<Type>) {
146
- if (key === 'category') {
117
+ public async update<Type, K extends string>(
118
+ updateKey: UpdateKey<K>,
119
+ op: Operation<Type>,
120
+ ) {
121
+ if (updateKey.key === 'category') {
147
122
  const content = structuredClone(this.content) as GraphViewMetadata;
148
123
  content.category = super.handleScalar(op) as string;
149
124
 
150
- await super.postUpdate(content, key, op);
125
+ await super.postUpdate(content, updateKey, op);
151
126
  return;
152
127
  }
153
128
 
154
- await super.update(key, op);
129
+ await super.update(updateKey, op);
155
130
  }
156
131
 
157
132
  /**
@@ -162,28 +137,11 @@ export class GraphViewResource extends FolderResource {
162
137
  * @returns array of card keys and calculation filenames that refer this resource.
163
138
  */
164
139
  public async usage(cards?: Card[]): Promise<string[]> {
165
- const allCards = cards ?? (await super.cards());
140
+ const allCards = cards ?? super.cards();
166
141
  const [relevantCards, calculations] = await Promise.all([
167
142
  super.usage(allCards),
168
143
  super.calculations(),
169
144
  ]);
170
145
  return [...relevantCards.sort(sortCards), ...calculations];
171
146
  }
172
-
173
- /**
174
- * Validates graph view.
175
- * @throws when there are validation errors.
176
- * @param content Content to be validated.
177
- * @note If content is not provided, base class validation will use resource's current content.
178
- */
179
- public async validate(content?: object) {
180
- return super.validate(content);
181
- }
182
-
183
- /**
184
- * Create the graph view's folder and handlebar file.
185
- */
186
- public async write() {
187
- await super.write();
188
- }
189
147
  }
@@ -10,37 +10,32 @@
10
10
  License along with this program. If not, see <https://www.gnu.org/licenses/>.
11
11
  */
12
12
 
13
- import type {
14
- Card,
15
- Operation,
16
- Project,
17
- ResourceName,
18
- } from './file-resource.js';
19
- import {
20
- DefaultContent,
21
- FileResource,
22
- resourceNameToString,
23
- sortCards,
24
- } from './folder-resource.js';
25
- import type { LinkType } from '../interfaces/resource-interfaces.js';
13
+ import { DefaultContent } from './create-defaults.js';
14
+ import { FileResource } from './file-resource.js';
15
+ import { resourceNameToString } from '../utils/resource-utils.js';
16
+ import { sortCards } from '../utils/card-utils.js';
17
+
18
+ import type { Card } from '../interfaces/project-interfaces.js';
19
+ import type { LinkType, UpdateKey } from '../interfaces/resource-interfaces.js';
20
+ import type { Operation } from './resource-object.js';
21
+ import type { Project } from '../containers/project.js';
22
+ import type { ResourceName } from '../utils/resource-utils.js';
26
23
 
27
24
  /**
28
25
  * Link Type resource class.
29
26
  */
30
- export class LinkTypeResource extends FileResource {
27
+ export class LinkTypeResource extends FileResource<LinkType> {
31
28
  constructor(project: Project, name: ResourceName) {
32
29
  super(project, name, 'linkTypes');
33
30
 
34
31
  this.contentSchemaId = 'linkTypeSchema';
35
32
  this.contentSchema = super.contentSchemaContent(this.contentSchemaId);
36
-
37
- this.initialize();
38
33
  }
39
34
 
40
35
  // When resource name changes.
41
36
  private async handleNameChange(existingName: string) {
42
- const current = this.content as LinkType;
43
- const prefixes = await this.project.projectPrefixes();
37
+ const current = this.content;
38
+ const prefixes = this.project.projectPrefixes();
44
39
  if (current.sourceCardTypes) {
45
40
  current.sourceCardTypes = current.sourceCardTypes.map((item) =>
46
41
  this.updatePrefixInResourceName(item, prefixes),
@@ -74,20 +69,6 @@ export class LinkTypeResource extends FileResource {
74
69
  return super.create(newContent);
75
70
  }
76
71
 
77
- /**
78
- * Returns content data.
79
- */
80
- public get data() {
81
- return super.data as LinkType;
82
- }
83
-
84
- /**
85
- * Deletes file(s) from disk and clears out the memory resident object.
86
- */
87
- public async delete() {
88
- return super.delete();
89
- }
90
-
91
72
  /**
92
73
  * Renames resource metadata file and renames memory resident object 'name'.
93
74
  * @param newName New name for the resource.
@@ -98,26 +79,22 @@ export class LinkTypeResource extends FileResource {
98
79
  return this.handleNameChange(existingName);
99
80
  }
100
81
 
101
- /**
102
- * Shows metadata of the resource.
103
- * @returns link type metadata.
104
- */
105
- public async show(): Promise<LinkType> {
106
- return super.show() as Promise<LinkType>;
107
- }
108
-
109
82
  /**
110
83
  * Updates link type resource.
111
- * @param key Key to modify
84
+ * @param updateKey Key to modify
112
85
  * @param op Operation to perform on 'key'
113
86
  */
114
- public async update<Type>(key: string, op: Operation<Type>) {
87
+ public async update<Type, K extends string>(
88
+ updateKey: UpdateKey<K>,
89
+ op: Operation<Type>,
90
+ ) {
91
+ const { key } = updateKey;
115
92
  const nameChange = key === 'name';
116
93
  const existingName = this.content.name;
117
94
 
118
- await super.update(key, op);
95
+ await super.update(updateKey, op);
119
96
 
120
- const content = structuredClone(this.content) as LinkType;
97
+ const content = structuredClone(this.content);
121
98
  if (key === 'name') {
122
99
  content.name = super.handleScalar(op) as string;
123
100
  } else if (key === 'destinationCardTypes') {
@@ -142,7 +119,7 @@ export class LinkTypeResource extends FileResource {
142
119
  throw new Error(`Unknown property '${key}' for FieldType`);
143
120
  }
144
121
 
145
- await super.postUpdate(content, key, op);
122
+ await super.postUpdate(content, updateKey, op);
146
123
 
147
124
  // Renaming this card type causes that references to its name must be updated.
148
125
  if (nameChange) {
@@ -159,7 +136,7 @@ export class LinkTypeResource extends FileResource {
159
136
  */
160
137
  public async usage(cards?: Card[]): Promise<string[]> {
161
138
  const resourceName = resourceNameToString(this.resourceName);
162
- const allCards = cards || (await super.cards());
139
+ const allCards = cards || super.cards();
163
140
 
164
141
  const cardsThatUseLinkType = allCards
165
142
  .filter((card) =>
@@ -181,11 +158,4 @@ export class LinkTypeResource extends FileResource {
181
158
  // Using Set to avoid duplicate cards
182
159
  return [...new Set([...cardReferences, ...calculations])];
183
160
  }
184
-
185
- /**
186
- * Validates the resource. If object is invalid, throws.
187
- */
188
- public async validate(content?: object) {
189
- return super.validate(content);
190
- }
191
161
  }
@@ -12,72 +12,48 @@
12
12
  License along with this program. If not, see <https://www.gnu.org/licenses/>.
13
13
  */
14
14
 
15
- import { readdir } from 'node:fs/promises';
16
- import { readFileSync } from 'node:fs';
17
15
  import { extname, join } from 'node:path';
16
+ import { readdir } from 'node:fs/promises';
18
17
 
19
18
  import { copyDir } from '../utils/file-utils.js';
20
- import {
21
- DefaultContent,
22
- FolderResource,
23
- resourceNameToString,
24
- sortCards,
25
- } from './folder-resource.js';
19
+ import { DefaultContent } from './create-defaults.js';
20
+ import { FolderResource } from './folder-resource.js';
26
21
  import { getStaticDirectoryPath } from '@cyberismo/assets';
27
- import { filename } from '../interfaces/folder-content-interfaces.js';
22
+ import { resourceNameToString } from '../utils/resource-utils.js';
23
+ import { sortCards } from '../utils/card-utils.js';
28
24
  import { Validate } from '../commands/validate.js';
29
25
 
26
+ import type { Card } from '../interfaces/project-interfaces.js';
27
+ import type { Operation } from './resource-object.js';
28
+ import type { Project } from '../containers/project.js';
29
+ import type { ReportContent } from '../interfaces/folder-content-interfaces.js';
30
30
  import type {
31
- Card,
32
- Operation,
33
- Project,
34
- ResourceName,
35
- } from './folder-resource.js';
36
- import type {
37
- Report,
38
31
  ReportMetadata,
39
- ReportUpdateKey,
32
+ UpdateKey,
40
33
  } from '../interfaces/resource-interfaces.js';
41
- import type { ReportContent } from '../interfaces/folder-content-interfaces.js';
42
- import type { Schema } from 'jsonschema';
34
+ import type { ResourceName } from '../utils/resource-utils.js';
43
35
 
44
- const REPORT_SCHEMA_FILE = 'parameterSchema.json';
45
36
  const PARAMETER_SCHEMA_ID = 'jsonSchema';
46
37
 
47
- const staticDirectoryPath = await getStaticDirectoryPath();
48
-
49
38
  /**
50
39
  * Report resource class.
51
40
  */
52
- export class ReportResource extends FolderResource {
53
- private reportSchema: Schema;
41
+ export class ReportResource extends FolderResource<
42
+ ReportMetadata,
43
+ ReportContent
44
+ > {
54
45
  constructor(project: Project, name: ResourceName) {
55
46
  super(project, name, 'reports');
56
47
 
57
48
  this.contentSchemaId = 'reportSchema';
58
49
  this.contentSchema = super.contentSchemaContent(this.contentSchemaId);
59
-
60
- this.initialize();
61
-
62
- const schemaPath = join(this.internalFolder, REPORT_SCHEMA_FILE);
63
- this.reportSchema = this.readSchemaFile(schemaPath);
64
50
  }
65
51
 
66
52
  // Path to content folder.
67
53
  // @todo: create the files' content dynamically.
68
- private defaultReportLocation: string = join(
69
- staticDirectoryPath,
70
- 'defaultReport',
71
- );
72
-
73
- // Try to read schema file content
74
- private readSchemaFile(path: string) {
75
- try {
76
- const schema = readFileSync(path);
77
- return JSON.parse(schema.toString());
78
- } catch {
79
- return undefined;
80
- }
54
+ private async getDefaultReportLocation(): Promise<string> {
55
+ const staticDirectoryPath = await getStaticDirectoryPath();
56
+ return join(staticDirectoryPath, 'defaultReport');
81
57
  }
82
58
 
83
59
  /**
@@ -99,8 +75,6 @@ export class ReportResource extends FolderResource {
99
75
 
100
76
  /**
101
77
  * Sets new metadata into the report object.
102
- * @param newContent metadata content for the report.
103
- * @throws if 'newContent' is not valid.
104
78
  */
105
79
  public async createReport() {
106
80
  const defaultContent = DefaultContent.report(
@@ -110,21 +84,9 @@ export class ReportResource extends FolderResource {
110
84
  await super.create(defaultContent);
111
85
 
112
86
  // Copy report default structure to destination.
113
- await copyDir(this.defaultReportLocation, this.internalFolder);
114
- }
115
-
116
- /**
117
- * Returns resource content.
118
- */
119
- public get data(): ReportMetadata {
120
- return super.data as ReportMetadata;
121
- }
122
-
123
- /**
124
- * Deletes file and folder that this resource is based on.
125
- */
126
- public async delete() {
127
- return super.delete();
87
+ const defaultReportLocation = await this.getDefaultReportLocation();
88
+ await copyDir(defaultReportLocation, this.internalFolder);
89
+ await this.loadContentFiles();
128
90
  }
129
91
 
130
92
  /**
@@ -152,49 +114,24 @@ export class ReportResource extends FolderResource {
152
114
  return this.onNameChange(existingName);
153
115
  }
154
116
 
155
- /**
156
- * Shows metadata of the resource.
157
- * @returns report metadata.
158
- */
159
- public async show(): Promise<Report> {
160
- const baseData = (await super.show()) as ReportMetadata;
161
- const fileContents = await super.contentData();
162
- const content: ReportContent = {
163
- contentTemplate: fileContents.contentTemplate as string,
164
- queryTemplate: fileContents.queryTemplate as string,
165
- schema: fileContents.schema ? (fileContents.schema as Schema) : undefined,
166
- };
167
- return {
168
- ...baseData,
169
- content: content,
170
- };
171
- }
172
-
173
117
  /**
174
118
  * Updates report resource.
175
- * @param key Key to modify
119
+ * @param updateKey Key to modify
176
120
  * @param op Operation to perform on 'key'
177
121
  */
178
- public async update<Type>(key: ReportUpdateKey, op: Operation<Type>) {
179
- if (
180
- typeof key === 'object' &&
181
- key.key === 'content' &&
182
- key.subKey === 'schema'
183
- ) {
184
- const fileContent = JSON.stringify(super.handleScalar(op), null, 2);
185
- await this.updateFile(filename(key.subKey)!, fileContent);
186
- return;
187
- }
188
-
189
- if (key === 'category') {
190
- const content = structuredClone(this.content) as ReportMetadata;
122
+ public async update<Type, K extends string>(
123
+ updateKey: UpdateKey<K>,
124
+ op: Operation<Type>,
125
+ ) {
126
+ if (updateKey.key === 'category') {
127
+ const content = structuredClone(this.content);
191
128
  content.category = super.handleScalar(op) as string;
192
129
 
193
- await super.postUpdate(content, key, op);
130
+ await super.postUpdate(content, updateKey, op);
194
131
  return;
195
132
  }
196
133
 
197
- await super.update(key, op);
134
+ await super.update(updateKey, op);
198
135
  }
199
136
 
200
137
  /**
@@ -205,7 +142,7 @@ export class ReportResource extends FolderResource {
205
142
  * @returns array of card keys and calculation filenames that refer this resource.
206
143
  */
207
144
  public async usage(cards?: Card[]): Promise<string[]> {
208
- const allCards = cards ?? (await super.cards());
145
+ const allCards = cards ?? super.cards();
209
146
  const [relevantCards, calculations] = await Promise.all([
210
147
  super.usage(allCards),
211
148
  super.calculations(),
@@ -220,9 +157,10 @@ export class ReportResource extends FolderResource {
220
157
  * @note If content is not provided, base class validation will use resource's current content.
221
158
  */
222
159
  public async validate(content?: object) {
223
- if (this.reportSchema) {
160
+ const resourceContent = this.contentData();
161
+ if (resourceContent.schema) {
224
162
  const errors = Validate.getInstance().validateJson(
225
- this.reportSchema,
163
+ resourceContent.schema,
226
164
  PARAMETER_SCHEMA_ID,
227
165
  );
228
166
  if (errors.length > 0) {