@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
@@ -11,32 +11,30 @@
11
11
  License along with this program. If not, see <https://www.gnu.org/licenses/>.
12
12
  */
13
13
 
14
- import { basename, dirname, join } from 'node:path';
14
+ import { dirname, join } from 'node:path';
15
15
  import { mkdir } from 'node:fs/promises';
16
16
 
17
- import type {
18
- Card,
19
- Operation,
20
- Project,
21
- ResourceName,
22
- } from './folder-resource.js';
23
- import {
24
- DefaultContent,
25
- FolderResource,
26
- resourceNameToString,
27
- sortCards,
28
- } from './folder-resource.js';
17
+ import { DefaultContent } from './create-defaults.js';
18
+ import { FolderResource } from './folder-resource.js';
19
+ import { resourceNameToString } from '../utils/resource-utils.js';
20
+ import { sortCards } from '../utils/card-utils.js';
21
+ import { Template } from '../containers/template.js';
22
+ import { writeJsonFile } from '../utils/json.js';
23
+
24
+ import type { Card } from '../interfaces/project-interfaces.js';
25
+ import type { Operation } from './resource-object.js';
26
+ import type { Project } from '../containers/project.js';
27
+ import type { ResourceName } from '../utils/resource-utils.js';
29
28
  import type {
30
29
  TemplateConfiguration,
31
30
  TemplateMetadata,
31
+ UpdateKey,
32
32
  } from '../interfaces/resource-interfaces.js';
33
- import { Template } from '../containers/template.js';
34
- import { writeJsonFile } from '../utils/json.js';
35
33
 
36
34
  /**
37
35
  * Template resource class.
38
36
  */
39
- export class TemplateResource extends FolderResource {
37
+ export class TemplateResource extends FolderResource<TemplateMetadata, never> {
40
38
  private cardContainer: Template;
41
39
  private cardsFolder = '';
42
40
  private cardsSchema = super.contentSchemaContent('cardBaseSchema');
@@ -47,12 +45,12 @@ export class TemplateResource extends FolderResource {
47
45
  this.contentSchemaId = 'templateSchema';
48
46
  this.contentSchema = super.contentSchemaContent(this.contentSchemaId);
49
47
 
50
- this.initialize();
51
48
  this.cardsFolder = join(this.internalFolder, 'c');
52
49
 
53
50
  // Each template resource contains a template card container (with template cards).
51
+ // todo: Fix Template constructor not to use Resource, but just this filename with path
54
52
  this.cardContainer = new Template(this.project, {
55
- name: basename(this.fileName),
53
+ name: resourceNameToString(this.resourceName),
56
54
  path: dirname(this.fileName),
57
55
  });
58
56
  }
@@ -86,17 +84,13 @@ export class TemplateResource extends FolderResource {
86
84
  return super.create(newContent);
87
85
  }
88
86
 
89
- /**
90
- * Returns content data.
91
- */
92
- public get data(): TemplateMetadata {
93
- return super.data as TemplateMetadata;
94
- }
95
-
96
87
  /**
97
88
  * Deletes file and folder that this resource is based on.
89
+ * Also removes template cards from the project's card cache.
98
90
  */
99
91
  public async delete() {
92
+ const templateName = resourceNameToString(this.resourceName);
93
+ this.project.cardsCache.deleteCardsFromTemplate(templateName);
100
94
  return super.delete();
101
95
  }
102
96
 
@@ -114,8 +108,8 @@ export class TemplateResource extends FolderResource {
114
108
  * Shows metadata of the resource.
115
109
  * @returns template metadata.
116
110
  */
117
- public async show(): Promise<TemplateConfiguration> {
118
- const templateMetadata = (await super.show()) as TemplateMetadata;
111
+ public show(): TemplateConfiguration {
112
+ const templateMetadata = super.show();
119
113
  const container = this.templateObject();
120
114
 
121
115
  return {
@@ -124,7 +118,7 @@ export class TemplateResource extends FolderResource {
124
118
  displayName: templateMetadata.displayName,
125
119
  description: templateMetadata.description,
126
120
  path: this.fileName,
127
- numberOfCards: (await container.listCards()).length,
121
+ numberOfCards: container.listCards().length,
128
122
  };
129
123
  }
130
124
 
@@ -138,20 +132,24 @@ export class TemplateResource extends FolderResource {
138
132
 
139
133
  /**
140
134
  * Updates template resource.
141
- * @param key Key to modify
135
+ * @param updateKey Key to modify
142
136
  * @param op Operation to perform on 'key'
143
137
  * @throws if key is unknown.
144
138
  */
145
- public async update<Type>(key: string, op: Operation<Type>) {
139
+ public async update<Type, K extends string>(
140
+ updateKey: UpdateKey<K>,
141
+ op: Operation<Type>,
142
+ ) {
143
+ const { key } = updateKey;
146
144
  const nameChange = key === 'name';
147
145
  const existingName = this.content.name;
148
146
 
149
147
  // Only call super.update for keys that base class supports
150
148
  if (key === 'name' || key === 'displayName' || key === 'description') {
151
- await super.update(key, op);
149
+ await super.update(updateKey, op);
152
150
  }
153
151
 
154
- const content = structuredClone(this.content) as TemplateMetadata;
152
+ const content = structuredClone(this.content);
155
153
 
156
154
  if (key === 'name') {
157
155
  content.name = super.handleScalar(op) as string;
@@ -165,7 +163,7 @@ export class TemplateResource extends FolderResource {
165
163
  throw new Error(`Unknown property '${key}' for Template`);
166
164
  }
167
165
 
168
- await super.postUpdate(content, key, op);
166
+ await super.postUpdate(content, updateKey, op);
169
167
 
170
168
  // Renaming this template causes that references to its name must be updated.
171
169
  if (nameChange) {
@@ -181,7 +179,7 @@ export class TemplateResource extends FolderResource {
181
179
  * @returns array of card keys, and calculation filenames that refer this resource.
182
180
  */
183
181
  public async usage(cards?: Card[]): Promise<string[]> {
184
- const allCards = cards ?? (await super.cards());
182
+ const allCards = cards ?? super.cards();
185
183
  const [relevantCards, calculations] = await Promise.all([
186
184
  super.usage(allCards),
187
185
  super.calculations(),
@@ -189,16 +187,6 @@ export class TemplateResource extends FolderResource {
189
187
  return [...relevantCards.sort(sortCards), ...calculations];
190
188
  }
191
189
 
192
- /**
193
- * Validates template.
194
- * @throws when there are validation errors.
195
- * @param content Content to be validated.
196
- * @note If content is not provided, base class validation will use resource's current content.
197
- */
198
- public async validate(content?: object) {
199
- return super.validate(content);
200
- }
201
-
202
190
  /**
203
191
  * Create the template's cards folder.
204
192
  */
@@ -13,58 +13,43 @@
13
13
  */
14
14
 
15
15
  import type {
16
- CardType,
16
+ UpdateKey,
17
17
  Workflow,
18
18
  WorkflowState,
19
19
  WorkflowTransition,
20
20
  } from '../interfaces/resource-interfaces.js';
21
- import { CardTypeResource } from './card-type-resource.js';
21
+ import { DefaultContent } from './create-defaults.js';
22
+ import { FileResource } from './file-resource.js';
23
+ import { resourceNameToString } from '../utils/resource-utils.js';
24
+ import { sortCards } from '../utils/card-utils.js';
25
+
26
+ import type { Card } from '../interfaces/project-interfaces.js';
22
27
  import type {
23
- Card,
24
28
  ChangeOperation,
25
29
  Operation,
26
- Project,
27
30
  RemoveOperation,
28
- ResourceName,
29
- } from './file-resource.js';
30
- import {
31
- DefaultContent,
32
- FileResource,
33
- resourceNameToString,
34
- sortCards,
35
- } from './folder-resource.js';
36
- import { ResourcesFrom } from '../containers/project.js';
37
- import { resourceName } from './file-resource.js';
31
+ } from './resource-object.js';
32
+ import type { Project } from '../containers/project.js';
33
+ import type { ResourceName } from '../utils/resource-utils.js';
38
34
 
39
35
  /**
40
36
  * Workflow resource class.
41
37
  */
42
- export class WorkflowResource extends FileResource {
38
+ export class WorkflowResource extends FileResource<Workflow> {
43
39
  constructor(project: Project, name: ResourceName) {
44
40
  super(project, name, 'workflows');
45
41
 
46
42
  this.contentSchemaId = 'workflowSchema';
47
43
  this.contentSchema = super.contentSchemaContent(this.contentSchemaId);
48
-
49
- this.initialize();
50
44
  }
51
45
 
52
46
  // Collect all cards that use this workflow.
53
47
  private async collectCardsUsingWorkflow(): Promise<Card[]> {
54
- const cardTypes = await this.project.cardTypes(ResourcesFrom.localOnly);
48
+ const cardTypes = this.project.resources.cardTypes();
55
49
  const promises: Promise<Card[]>[] = [];
56
50
  for (const cardType of cardTypes) {
57
- const object = new CardTypeResource(
58
- this.project,
59
- resourceName(cardType.name),
60
- );
61
- if (
62
- object.data &&
63
- (object.data as CardType).workflow ===
64
- resourceNameToString(this.resourceName)
65
- ) {
66
- // fetch all cards with card type
67
- promises.push(this.collectCards({ metadata: true }, cardType.name));
51
+ if (cardType.data?.workflow === resourceNameToString(this.resourceName)) {
52
+ promises.push(this.collectCards(cardType.data.name));
68
53
  }
69
54
  }
70
55
  return (await Promise.all(promises)).flat();
@@ -82,7 +67,7 @@ export class WorkflowResource extends FileResource {
82
67
 
83
68
  // Handle change of workflow state.
84
69
  private async handleStateChange(op: ChangeOperation<WorkflowState>) {
85
- const content = structuredClone(this.content) as Workflow;
70
+ const content = structuredClone(this.content);
86
71
  const stateName = this.targetName(op) as string;
87
72
  // Check that state can be changed to
88
73
  content.transitions = content.transitions.filter(
@@ -107,7 +92,7 @@ export class WorkflowResource extends FileResource {
107
92
  // Handle removal of workflow state.
108
93
  // State can be removed with or without replacement.
109
94
  private async handleStateRemoval(op: RemoveOperation<WorkflowState>) {
110
- const content = structuredClone(this.content) as Workflow;
95
+ const content = structuredClone(this.content);
111
96
  const stateName = this.targetName(op) as string;
112
97
 
113
98
  // If there is no replacement value, remove all transitions "to" and "from" this state.
@@ -153,8 +138,8 @@ export class WorkflowResource extends FileResource {
153
138
  }
154
139
 
155
140
  // Potentially updates the changed transition with current properties.
156
- private async transitionObject(op: ChangeOperation<WorkflowTransition>) {
157
- const content = structuredClone(this.content) as Workflow;
141
+ private transitionObject(op: ChangeOperation<WorkflowTransition>) {
142
+ const content = structuredClone(this.content);
158
143
  const targetTransitionName = this.targetName(op);
159
144
  const currentTransition = content.transitions.filter(
160
145
  (item) => item.name === targetTransitionName,
@@ -201,20 +186,19 @@ export class WorkflowResource extends FileResource {
201
186
 
202
187
  // Update dependant card types.
203
188
  private async updateCardTypes(oldName: string) {
204
- const cardTypes = await this.project.cardTypes(ResourcesFrom.localOnly);
189
+ const cardTypes = this.project.resources.cardTypes();
205
190
  const op = {
206
191
  name: 'change',
207
192
  target: oldName,
208
193
  to: this.content.name,
209
194
  } as ChangeOperation<string>;
210
195
  for (const cardType of cardTypes) {
211
- const object = new CardTypeResource(
212
- this.project,
213
- resourceName(cardType.name),
196
+ await cardType.update(
197
+ {
198
+ key: 'workflow',
199
+ },
200
+ op,
214
201
  );
215
- if (object.data && (object.data as CardType).workflow === oldName) {
216
- await object.update('workflow', op);
217
- }
218
202
  }
219
203
  }
220
204
 
@@ -234,21 +218,6 @@ export class WorkflowResource extends FileResource {
234
218
  return super.create(newContent);
235
219
  }
236
220
 
237
- /**
238
- * Returns content data.
239
- */
240
- public get data(): Workflow {
241
- return super.data as Workflow;
242
- }
243
-
244
- /**
245
- * Deletes file that this object is based on.
246
- * If there are card types that depended on this workflow, they are now invalid.
247
- */
248
- public async delete() {
249
- return super.delete();
250
- }
251
-
252
221
  /**
253
222
  * Renames the object and the file.
254
223
  * @param newName New name for the resource.
@@ -259,25 +228,21 @@ export class WorkflowResource extends FileResource {
259
228
  return this.handleNameChange(existingName);
260
229
  }
261
230
 
262
- /**
263
- * Shows metadata of the resource.
264
- * @returns workflow metadata.
265
- */
266
- public async show(): Promise<Workflow> {
267
- return super.show() as Promise<Workflow>;
268
- }
269
-
270
231
  /**
271
232
  * Updates workflow resource.
272
- * @param key Key to modify
233
+ * @param updateKey Key to modify
273
234
  * @param op Operation to perform on 'key'
274
235
  * @throws if key is unknown.
275
236
  */
276
- public async update<Type>(key: string, op: Operation<Type>) {
237
+ public async update<Type, K extends string>(
238
+ updateKey: UpdateKey<K>,
239
+ op: Operation<Type>,
240
+ ) {
241
+ const { key } = updateKey;
277
242
  const nameChange = key === 'name';
278
243
  const existingName = this.content.name;
279
244
 
280
- await super.update(key, op);
245
+ await super.update(updateKey, op);
281
246
 
282
247
  const content = structuredClone(this.content) as Workflow;
283
248
 
@@ -334,7 +299,7 @@ export class WorkflowResource extends FileResource {
334
299
  // If workflow state is removed, remove all transitions "to" and "from" this state.
335
300
  let removeOp: RemoveOperation<WorkflowState>;
336
301
  if (this.isStringOperation(op)) {
337
- const toBeRemovedState = (this.content as Workflow).states.find(
302
+ const toBeRemovedState = this.content.states.find(
338
303
  (state) => state.name === op.target,
339
304
  );
340
305
  removeOp = {
@@ -349,7 +314,7 @@ export class WorkflowResource extends FileResource {
349
314
  // If workflow state is renamed, replace all transitions "to" and "from" the old state with new state.
350
315
  let changeOp: ChangeOperation<WorkflowState>;
351
316
  if (this.isStringOperation(op)) {
352
- const toBeChangedState = (this.content as Workflow).states.find(
317
+ const toBeChangedState = this.content.states.find(
353
318
  (state) => state.name === op.target,
354
319
  );
355
320
  changeOp = {
@@ -363,7 +328,7 @@ export class WorkflowResource extends FileResource {
363
328
  await this.handleStateChange(changeOp);
364
329
  }
365
330
 
366
- await super.postUpdate(content, key, op);
331
+ await super.postUpdate(content, updateKey, op);
367
332
 
368
333
  // Renaming this workflow causes that references to its name must be updated.
369
334
  if (nameChange) {
@@ -381,14 +346,14 @@ export class WorkflowResource extends FileResource {
381
346
  */
382
347
  public async usage(cards?: Card[]): Promise<string[]> {
383
348
  const resourceName = resourceNameToString(this.resourceName);
384
- const allCards = cards ?? (await super.cards());
385
- const cardTypes = await this.project.cardTypes(ResourcesFrom.all);
386
- const cardTypeReferences = await Promise.all(
387
- cardTypes.map(async (cardType) => {
388
- const metadata = await this.project.resource<CardType>(cardType.name);
389
- return metadata?.workflow === resourceName ? cardType.name : null;
390
- }),
391
- );
349
+ const allCards = cards ?? super.cards();
350
+ const cardTypes = this.project.resources.cardTypes();
351
+ const cardTypeReferences = [];
352
+ for (const cardType of cardTypes) {
353
+ if (cardType.data?.workflow === resourceName) {
354
+ cardTypeReferences.push(cardType.data.name);
355
+ }
356
+ }
392
357
 
393
358
  const [relevantCards, calculations] = await Promise.all([
394
359
  super.usage(allCards),
@@ -401,12 +366,4 @@ export class WorkflowResource extends FileResource {
401
366
  ...calculations,
402
367
  ];
403
368
  }
404
-
405
- /**
406
- * Validates workflow.
407
- * @throws when there are validation errors.
408
- */
409
- public validate(content?: object): Promise<void> {
410
- return super.validate(content);
411
- }
412
369
  }