@cyberismo/data-handler 0.0.2

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 (306) hide show
  1. package/LICENSE +702 -0
  2. package/dist/card-metadata-updater.d.ts +33 -0
  3. package/dist/card-metadata-updater.js +121 -0
  4. package/dist/card-metadata-updater.js.map +1 -0
  5. package/dist/command-handler.d.ts +96 -0
  6. package/dist/command-handler.js +557 -0
  7. package/dist/command-handler.js.map +1 -0
  8. package/dist/command-manager.d.ts +43 -0
  9. package/dist/command-manager.js +73 -0
  10. package/dist/command-manager.js.map +1 -0
  11. package/dist/commands/calculate.d.ts +86 -0
  12. package/dist/commands/calculate.js +444 -0
  13. package/dist/commands/calculate.js.map +1 -0
  14. package/dist/commands/create.d.ts +114 -0
  15. package/dist/commands/create.js +389 -0
  16. package/dist/commands/create.js.map +1 -0
  17. package/dist/commands/edit.d.ts +37 -0
  18. package/dist/commands/edit.js +99 -0
  19. package/dist/commands/edit.js.map +1 -0
  20. package/dist/commands/export-site.d.ts +45 -0
  21. package/dist/commands/export-site.js +301 -0
  22. package/dist/commands/export-site.js.map +1 -0
  23. package/dist/commands/export.d.ts +53 -0
  24. package/dist/commands/export.js +251 -0
  25. package/dist/commands/export.js.map +1 -0
  26. package/dist/commands/import.d.ts +53 -0
  27. package/dist/commands/import.js +133 -0
  28. package/dist/commands/import.js.map +1 -0
  29. package/dist/commands/index.d.ts +26 -0
  30. package/dist/commands/index.js +27 -0
  31. package/dist/commands/index.js.map +1 -0
  32. package/dist/commands/move.d.ts +55 -0
  33. package/dist/commands/move.js +341 -0
  34. package/dist/commands/move.js.map +1 -0
  35. package/dist/commands/remove.d.ts +38 -0
  36. package/dist/commands/remove.js +192 -0
  37. package/dist/commands/remove.js.map +1 -0
  38. package/dist/commands/rename.d.ts +46 -0
  39. package/dist/commands/rename.js +289 -0
  40. package/dist/commands/rename.js.map +1 -0
  41. package/dist/commands/show.d.ts +124 -0
  42. package/dist/commands/show.js +345 -0
  43. package/dist/commands/show.js.map +1 -0
  44. package/dist/commands/transition.d.ts +27 -0
  45. package/dist/commands/transition.js +92 -0
  46. package/dist/commands/transition.js.map +1 -0
  47. package/dist/commands/update.d.ts +29 -0
  48. package/dist/commands/update.js +64 -0
  49. package/dist/commands/update.js.map +1 -0
  50. package/dist/commands/validate.d.ts +143 -0
  51. package/dist/commands/validate.js +689 -0
  52. package/dist/commands/validate.js.map +1 -0
  53. package/dist/containers/card-container.d.ts +44 -0
  54. package/dist/containers/card-container.js +282 -0
  55. package/dist/containers/card-container.js.map +1 -0
  56. package/dist/containers/project/project-paths.d.ts +46 -0
  57. package/dist/containers/project/project-paths.js +105 -0
  58. package/dist/containers/project/project-paths.js.map +1 -0
  59. package/dist/containers/project/resource-collector.d.ts +86 -0
  60. package/dist/containers/project/resource-collector.js +331 -0
  61. package/dist/containers/project/resource-collector.js.map +1 -0
  62. package/dist/containers/project.d.ts +351 -0
  63. package/dist/containers/project.js +896 -0
  64. package/dist/containers/project.js.map +1 -0
  65. package/dist/containers/template.d.ts +108 -0
  66. package/dist/containers/template.js +433 -0
  67. package/dist/containers/template.js.map +1 -0
  68. package/dist/exceptions/index.d.ts +19 -0
  69. package/dist/exceptions/index.js +26 -0
  70. package/dist/exceptions/index.js.map +1 -0
  71. package/dist/index.d.ts +16 -0
  72. package/dist/index.js +15 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/interfaces/adoc.d.ts +12 -0
  75. package/dist/interfaces/adoc.js +13 -0
  76. package/dist/interfaces/adoc.js.map +1 -0
  77. package/dist/interfaces/macros.d.ts +45 -0
  78. package/dist/interfaces/macros.js +13 -0
  79. package/dist/interfaces/macros.js.map +1 -0
  80. package/dist/interfaces/project-interfaces.d.ts +121 -0
  81. package/dist/interfaces/project-interfaces.js +21 -0
  82. package/dist/interfaces/project-interfaces.js.map +1 -0
  83. package/dist/interfaces/request-status-interfaces.d.ts +28 -0
  84. package/dist/interfaces/request-status-interfaces.js +20 -0
  85. package/dist/interfaces/request-status-interfaces.js.map +1 -0
  86. package/dist/interfaces/resource-interfaces.d.ts +117 -0
  87. package/dist/interfaces/resource-interfaces.js +20 -0
  88. package/dist/interfaces/resource-interfaces.js.map +1 -0
  89. package/dist/macros/base-macro.d.ts +31 -0
  90. package/dist/macros/base-macro.js +126 -0
  91. package/dist/macros/base-macro.js.map +1 -0
  92. package/dist/macros/common.d.ts +17 -0
  93. package/dist/macros/common.js +23 -0
  94. package/dist/macros/common.js.map +1 -0
  95. package/dist/macros/createCards/index.d.ts +36 -0
  96. package/dist/macros/createCards/index.js +35 -0
  97. package/dist/macros/createCards/index.js.map +1 -0
  98. package/dist/macros/createCards/metadata.d.ts +14 -0
  99. package/dist/macros/createCards/metadata.js +18 -0
  100. package/dist/macros/createCards/metadata.js.map +1 -0
  101. package/dist/macros/graph/index.d.ts +29 -0
  102. package/dist/macros/graph/index.js +91 -0
  103. package/dist/macros/graph/index.js.map +1 -0
  104. package/dist/macros/graph/metadata.d.ts +14 -0
  105. package/dist/macros/graph/metadata.js +18 -0
  106. package/dist/macros/graph/metadata.js.map +1 -0
  107. package/dist/macros/index.d.ts +93 -0
  108. package/dist/macros/index.js +237 -0
  109. package/dist/macros/index.js.map +1 -0
  110. package/dist/macros/report/index.d.ts +26 -0
  111. package/dist/macros/report/index.js +70 -0
  112. package/dist/macros/report/index.js.map +1 -0
  113. package/dist/macros/report/metadata.d.ts +14 -0
  114. package/dist/macros/report/metadata.js +18 -0
  115. package/dist/macros/report/metadata.js.map +1 -0
  116. package/dist/macros/scoreCard/index.d.ts +30 -0
  117. package/dist/macros/scoreCard/index.js +38 -0
  118. package/dist/macros/scoreCard/index.js.map +1 -0
  119. package/dist/macros/scoreCard/metadata.d.ts +14 -0
  120. package/dist/macros/scoreCard/metadata.js +18 -0
  121. package/dist/macros/scoreCard/metadata.js.map +1 -0
  122. package/dist/macros/task-queue.d.ts +46 -0
  123. package/dist/macros/task-queue.js +69 -0
  124. package/dist/macros/task-queue.js.map +1 -0
  125. package/dist/module-manager.d.ts +62 -0
  126. package/dist/module-manager.js +350 -0
  127. package/dist/module-manager.js.map +1 -0
  128. package/dist/permissions/action-guard.d.ts +28 -0
  129. package/dist/permissions/action-guard.js +61 -0
  130. package/dist/permissions/action-guard.js.map +1 -0
  131. package/dist/project-settings.d.ts +42 -0
  132. package/dist/project-settings.js +120 -0
  133. package/dist/project-settings.js.map +1 -0
  134. package/dist/resources/array-handler.d.ts +28 -0
  135. package/dist/resources/array-handler.js +116 -0
  136. package/dist/resources/array-handler.js.map +1 -0
  137. package/dist/resources/card-type-resource.d.ts +72 -0
  138. package/dist/resources/card-type-resource.js +334 -0
  139. package/dist/resources/card-type-resource.js.map +1 -0
  140. package/dist/resources/create-defaults.d.ts +81 -0
  141. package/dist/resources/create-defaults.js +184 -0
  142. package/dist/resources/create-defaults.js.map +1 -0
  143. package/dist/resources/field-type-resource.d.ts +88 -0
  144. package/dist/resources/field-type-resource.js +411 -0
  145. package/dist/resources/field-type-resource.js.map +1 -0
  146. package/dist/resources/file-resource.d.ts +50 -0
  147. package/dist/resources/file-resource.js +301 -0
  148. package/dist/resources/file-resource.js.map +1 -0
  149. package/dist/resources/folder-resource.d.ts +66 -0
  150. package/dist/resources/folder-resource.js +100 -0
  151. package/dist/resources/folder-resource.js.map +1 -0
  152. package/dist/resources/graph-model-resource.d.ts +78 -0
  153. package/dist/resources/graph-model-resource.js +164 -0
  154. package/dist/resources/graph-model-resource.js.map +1 -0
  155. package/dist/resources/graph-view-resource.d.ts +78 -0
  156. package/dist/resources/graph-view-resource.js +163 -0
  157. package/dist/resources/graph-view-resource.js.map +1 -0
  158. package/dist/resources/link-type-resource.d.ts +62 -0
  159. package/dist/resources/link-type-resource.js +150 -0
  160. package/dist/resources/link-type-resource.js.map +1 -0
  161. package/dist/resources/report-resource.d.ts +77 -0
  162. package/dist/resources/report-resource.js +171 -0
  163. package/dist/resources/report-resource.js.map +1 -0
  164. package/dist/resources/resource-object.d.ts +108 -0
  165. package/dist/resources/resource-object.js +147 -0
  166. package/dist/resources/resource-object.js.map +1 -0
  167. package/dist/resources/template-resource.d.ts +82 -0
  168. package/dist/resources/template-resource.js +173 -0
  169. package/dist/resources/template-resource.js.map +1 -0
  170. package/dist/resources/workflow-resource.d.ts +67 -0
  171. package/dist/resources/workflow-resource.js +156 -0
  172. package/dist/resources/workflow-resource.js.map +1 -0
  173. package/dist/types/queries.d.ts +142 -0
  174. package/dist/types/queries.js +16 -0
  175. package/dist/types/queries.js.map +1 -0
  176. package/dist/utils/card-utils.d.ts +34 -0
  177. package/dist/utils/card-utils.js +78 -0
  178. package/dist/utils/card-utils.js.map +1 -0
  179. package/dist/utils/clingo-fact-builder.d.ts +58 -0
  180. package/dist/utils/clingo-fact-builder.js +126 -0
  181. package/dist/utils/clingo-fact-builder.js.map +1 -0
  182. package/dist/utils/clingo-facts.d.ts +97 -0
  183. package/dist/utils/clingo-facts.js +352 -0
  184. package/dist/utils/clingo-facts.js.map +1 -0
  185. package/dist/utils/clingo-parser.d.ts +59 -0
  186. package/dist/utils/clingo-parser.js +403 -0
  187. package/dist/utils/clingo-parser.js.map +1 -0
  188. package/dist/utils/clingo-program-builder.d.ts +39 -0
  189. package/dist/utils/clingo-program-builder.js +57 -0
  190. package/dist/utils/clingo-program-builder.js.map +1 -0
  191. package/dist/utils/common-utils.d.ts +24 -0
  192. package/dist/utils/common-utils.js +47 -0
  193. package/dist/utils/common-utils.js.map +1 -0
  194. package/dist/utils/constants.d.ts +18 -0
  195. package/dist/utils/constants.js +27 -0
  196. package/dist/utils/constants.js.map +1 -0
  197. package/dist/utils/csv.d.ts +18 -0
  198. package/dist/utils/csv.js +45 -0
  199. package/dist/utils/csv.js.map +1 -0
  200. package/dist/utils/file-utils.d.ts +69 -0
  201. package/dist/utils/file-utils.js +158 -0
  202. package/dist/utils/file-utils.js.map +1 -0
  203. package/dist/utils/json.d.ts +61 -0
  204. package/dist/utils/json.js +108 -0
  205. package/dist/utils/json.js.map +1 -0
  206. package/dist/utils/lexorank.d.ts +59 -0
  207. package/dist/utils/lexorank.js +159 -0
  208. package/dist/utils/lexorank.js.map +1 -0
  209. package/dist/utils/log-utils.d.ts +40 -0
  210. package/dist/utils/log-utils.js +109 -0
  211. package/dist/utils/log-utils.js.map +1 -0
  212. package/dist/utils/random.d.ts +19 -0
  213. package/dist/utils/random.js +34 -0
  214. package/dist/utils/random.js.map +1 -0
  215. package/dist/utils/resource-utils.d.ts +45 -0
  216. package/dist/utils/resource-utils.js +137 -0
  217. package/dist/utils/resource-utils.js.map +1 -0
  218. package/dist/utils/sanitize-svg.d.ts +18 -0
  219. package/dist/utils/sanitize-svg.js +38 -0
  220. package/dist/utils/sanitize-svg.js.map +1 -0
  221. package/dist/utils/user-preferences.d.ts +64 -0
  222. package/dist/utils/user-preferences.js +106 -0
  223. package/dist/utils/user-preferences.js.map +1 -0
  224. package/dist/utils/validate.d.ts +26 -0
  225. package/dist/utils/validate.js +53 -0
  226. package/dist/utils/validate.js.map +1 -0
  227. package/dist/utils/value-utils.d.ts +58 -0
  228. package/dist/utils/value-utils.js +181 -0
  229. package/dist/utils/value-utils.js.map +1 -0
  230. package/package.json +67 -0
  231. package/src/card-metadata-updater.ts +182 -0
  232. package/src/command-handler.ts +686 -0
  233. package/src/command-manager.ts +99 -0
  234. package/src/commands/calculate.ts +591 -0
  235. package/src/commands/create.ts +559 -0
  236. package/src/commands/edit.ts +123 -0
  237. package/src/commands/export-site.ts +356 -0
  238. package/src/commands/export.ts +315 -0
  239. package/src/commands/import.ts +169 -0
  240. package/src/commands/index.ts +42 -0
  241. package/src/commands/move.ts +451 -0
  242. package/src/commands/remove.ts +244 -0
  243. package/src/commands/rename.ts +378 -0
  244. package/src/commands/show.ts +442 -0
  245. package/src/commands/transition.ts +127 -0
  246. package/src/commands/update.ts +76 -0
  247. package/src/commands/validate.ts +962 -0
  248. package/src/containers/card-container.ts +378 -0
  249. package/src/containers/project/project-paths.ts +127 -0
  250. package/src/containers/project/resource-collector.ts +379 -0
  251. package/src/containers/project.ts +1135 -0
  252. package/src/containers/template.ts +573 -0
  253. package/src/exceptions/index.ts +29 -0
  254. package/src/index.ts +33 -0
  255. package/src/interfaces/adoc.ts +18 -0
  256. package/src/interfaces/macros.ts +54 -0
  257. package/src/interfaces/project-interfaces.ts +208 -0
  258. package/src/interfaces/request-status-interfaces.ts +30 -0
  259. package/src/interfaces/resource-interfaces.ts +179 -0
  260. package/src/macros/base-macro.ts +176 -0
  261. package/src/macros/common.ts +24 -0
  262. package/src/macros/createCards/index.ts +57 -0
  263. package/src/macros/createCards/metadata.ts +21 -0
  264. package/src/macros/graph/index.ts +130 -0
  265. package/src/macros/graph/metadata.ts +21 -0
  266. package/src/macros/index.ts +321 -0
  267. package/src/macros/report/index.ts +88 -0
  268. package/src/macros/report/metadata.ts +21 -0
  269. package/src/macros/scoreCard/index.ts +55 -0
  270. package/src/macros/scoreCard/metadata.ts +21 -0
  271. package/src/macros/task-queue.ts +79 -0
  272. package/src/module-manager.ts +443 -0
  273. package/src/permissions/action-guard.ts +77 -0
  274. package/src/project-settings.ts +140 -0
  275. package/src/resources/array-handler.ts +141 -0
  276. package/src/resources/card-type-resource.ts +455 -0
  277. package/src/resources/create-defaults.ts +216 -0
  278. package/src/resources/field-type-resource.ts +533 -0
  279. package/src/resources/file-resource.ts +433 -0
  280. package/src/resources/folder-resource.ts +140 -0
  281. package/src/resources/graph-model-resource.ts +205 -0
  282. package/src/resources/graph-view-resource.ts +199 -0
  283. package/src/resources/link-type-resource.ts +191 -0
  284. package/src/resources/report-resource.ts +224 -0
  285. package/src/resources/resource-object.ts +246 -0
  286. package/src/resources/template-resource.ts +210 -0
  287. package/src/resources/workflow-resource.ts +205 -0
  288. package/src/types/queries.ts +149 -0
  289. package/src/utils/card-utils.ts +83 -0
  290. package/src/utils/clingo-fact-builder.ts +167 -0
  291. package/src/utils/clingo-facts.ts +550 -0
  292. package/src/utils/clingo-parser.ts +519 -0
  293. package/src/utils/clingo-program-builder.ts +71 -0
  294. package/src/utils/common-utils.ts +54 -0
  295. package/src/utils/constants.ts +32 -0
  296. package/src/utils/csv.ts +53 -0
  297. package/src/utils/file-utils.ts +182 -0
  298. package/src/utils/json.ts +118 -0
  299. package/src/utils/lexorank.ts +180 -0
  300. package/src/utils/log-utils.ts +127 -0
  301. package/src/utils/random.ts +37 -0
  302. package/src/utils/resource-utils.ts +180 -0
  303. package/src/utils/sanitize-svg.ts +46 -0
  304. package/src/utils/user-preferences.ts +126 -0
  305. package/src/utils/validate.ts +66 -0
  306. package/src/utils/value-utils.ts +189 -0
@@ -0,0 +1,379 @@
1
+ /**
2
+ Cyberismo
3
+ Copyright © Cyberismo Ltd and contributors 2024
4
+
5
+ This program is free software: you can redistribute it and/or modify it under
6
+ the terms of the GNU Affero General Public License version 3 as published by
7
+ the Free Software Foundation. This program is distributed in the hope that it
8
+ will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
9
+ of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10
+ See the GNU Affero General Public License for more details.
11
+ You should have received a copy of the GNU Affero General Public
12
+ License along with this program. If not, see <https://www.gnu.org/licenses/>.
13
+ */
14
+
15
+ import { type Dirent, readdirSync } from 'node:fs';
16
+ import { readdir } from 'node:fs/promises';
17
+ import { join } from 'node:path';
18
+
19
+ import { CardContainer } from '../card-container.js';
20
+ import type { Project } from '../project.js';
21
+ import type { ProjectPaths } from './project-paths.js';
22
+ import type {
23
+ Resource,
24
+ ResourceFolderType,
25
+ } from '../../interfaces/project-interfaces.js';
26
+ import { resourceName } from '../../utils/resource-utils.js';
27
+ import { stripExtension } from '../../utils/file-utils.js';
28
+
29
+ /**
30
+ * Defines where resources are collected from.
31
+ * all - everywhere
32
+ * importOnly - only from imported modules
33
+ * localOnly - only from the project itself; excluding imported modules
34
+ */
35
+ export enum ResourcesFrom {
36
+ all = 'all',
37
+ importedOnly = 'imported',
38
+ localOnly = 'local',
39
+ }
40
+
41
+ // Helper class to contain collected resources.
42
+ class ResourceCollection {
43
+ public calculations: Resource[] = [];
44
+ public cardTypes: Resource[] = [];
45
+ public fieldTypes: Resource[] = [];
46
+ public graphModels: Resource[] = [];
47
+ public graphViews: Resource[] = [];
48
+ public linkTypes: Resource[] = [];
49
+ public reports: Resource[] = [];
50
+ public templates: Resource[] = [];
51
+ public workflows: Resource[] = [];
52
+
53
+ /**
54
+ * Returns resource array of a give type.
55
+ * @param type Resource array type to return.
56
+ * @returns resource array of a give type.
57
+ */
58
+ public resourceArray(type: ResourceFolderType): Resource[] {
59
+ if (type === 'calculations') return this.calculations;
60
+ if (type === 'cardTypes') return this.cardTypes;
61
+ if (type === 'fieldTypes') return this.fieldTypes;
62
+ if (type === 'graphViews') return this.graphViews;
63
+ if (type === 'graphModels') return this.graphModels;
64
+ if (type === 'linkTypes') return this.linkTypes;
65
+ if (type === 'reports') return this.reports;
66
+ if (type === 'templates') return this.templates;
67
+ if (type === 'workflows') return this.workflows;
68
+ throw new Error(`Unknown resource type '${type}'`);
69
+ }
70
+ }
71
+
72
+ /**
73
+ * This class handles local and modules resources.
74
+ */
75
+ export class ResourceCollector {
76
+ private local: ResourceCollection = new ResourceCollection();
77
+ private modules: ResourceCollection = new ResourceCollection();
78
+ private modulesCollected: boolean = false;
79
+ private paths: ProjectPaths;
80
+
81
+ constructor(private project: Project) {
82
+ this.paths = this.project.paths;
83
+ }
84
+
85
+ // Add resources of a given type to an array.
86
+ private async addResources(
87
+ resources: Dirent[],
88
+ requestedType: ResourceFolderType,
89
+ ): Promise<Resource[]> {
90
+ if (requestedType === 'modules') {
91
+ return resources.map((resource) => ({
92
+ name: resource.name,
93
+ path: resource.parentPath,
94
+ }));
95
+ }
96
+
97
+ const isValidFile = (item: Dirent): boolean =>
98
+ item.isFile() &&
99
+ item.name !== CardContainer.schemaContentFile &&
100
+ item.name !== '.gitkeep';
101
+
102
+ const processResource = async (resource: Dirent): Promise<Resource[]> => {
103
+ const resourcePath = join(
104
+ this.paths.modulesFolder,
105
+ resource.name,
106
+ requestedType,
107
+ );
108
+
109
+ try {
110
+ const files = await readdir(resourcePath, { withFileTypes: true });
111
+ return files.filter(isValidFile).map((item) => ({
112
+ name: `${resource.name}/${requestedType}/${stripExtension(item.name)}`,
113
+ path: item.parentPath,
114
+ }));
115
+ } catch {
116
+ return [];
117
+ }
118
+ };
119
+
120
+ const results = await Promise.all(resources.map(processResource));
121
+
122
+ return results.flat();
123
+ }
124
+
125
+ // Collects all module resources.
126
+ private async addModuleResources() {
127
+ if (!this.modulesCollected) {
128
+ const moduleDirectories = await readdir(this.paths.modulesFolder, {
129
+ withFileTypes: true,
130
+ });
131
+ const modules = moduleDirectories.filter((item) => item.isDirectory());
132
+
133
+ this.modules.calculations = [
134
+ ...(await this.addResources(modules, 'calculations')),
135
+ ];
136
+ this.modules.cardTypes = [
137
+ ...(await this.addResources(modules, 'cardTypes')),
138
+ ];
139
+ this.modules.fieldTypes = [
140
+ ...(await this.addResources(modules, 'fieldTypes')),
141
+ ];
142
+ this.modules.graphModels = [
143
+ ...(await this.addResources(modules, 'graphModels')),
144
+ ];
145
+ this.modules.graphViews = [
146
+ ...(await this.addResources(modules, 'graphViews')),
147
+ ];
148
+ this.modules.linkTypes = [
149
+ ...(await this.addResources(modules, 'linkTypes')),
150
+ ];
151
+ this.modules.reports = [...(await this.addResources(modules, 'reports'))];
152
+ this.modules.templates = [
153
+ ...(await this.addResources(modules, 'templates')),
154
+ ];
155
+ this.modules.workflows = [
156
+ ...(await this.addResources(modules, 'workflows')),
157
+ ];
158
+ this.modulesCollected = true;
159
+ }
160
+ }
161
+
162
+ // Adds a resource type from all modules.
163
+ private async addResourcesFromModules(
164
+ type: ResourceFolderType,
165
+ ): Promise<Resource[]> {
166
+ try {
167
+ // 'modules' is a bit special; it is collected separately from actual resources.
168
+ if (type === 'modules') {
169
+ const moduleDirectories = await readdir(this.paths.modulesFolder, {
170
+ withFileTypes: true,
171
+ });
172
+ const modules = moduleDirectories.filter((item) => item.isDirectory());
173
+ return [...(await this.addResources(modules, 'modules'))];
174
+ }
175
+
176
+ await this.addModuleResources();
177
+ return this.modules.resourceArray(type);
178
+ } catch {
179
+ return [];
180
+ }
181
+ }
182
+
183
+ // Joins local resources and module resources together to one array.
184
+ private joinResources(
185
+ from: ResourcesFrom,
186
+ localCollection: Resource[],
187
+ moduleCollection: Resource[],
188
+ ) {
189
+ if (from === ResourcesFrom.localOnly) {
190
+ return localCollection;
191
+ }
192
+ if (from === ResourcesFrom.importedOnly) {
193
+ return moduleCollection;
194
+ }
195
+ return [...localCollection, ...moduleCollection];
196
+ }
197
+
198
+ // Returns local resources of a given type.
199
+ private localResources(type: ResourceFolderType) {
200
+ if (type === 'modules') {
201
+ return [];
202
+ } else {
203
+ return this.local.resourceArray(type);
204
+ }
205
+ }
206
+
207
+ // Collects certain kinds of resources.
208
+ private resourcesSync(type: ResourceFolderType): Resource[] {
209
+ const resourceFolder = this.project.paths.resourcePath(type);
210
+ const resources: Resource[] = [];
211
+ let entries = [];
212
+ try {
213
+ entries = readdirSync(resourceFolder, { withFileTypes: true });
214
+ } catch {
215
+ return [];
216
+ }
217
+ resources.push(
218
+ ...entries
219
+ .filter((entry) => {
220
+ return (
221
+ entry.isFile() &&
222
+ entry.name !== '.gitkeep' &&
223
+ entry.name !== CardContainer.schemaContentFile
224
+ );
225
+ })
226
+ .map((entry) => {
227
+ if (entry.name.endsWith('.json')) {
228
+ entry.name = stripExtension(entry.name);
229
+ }
230
+ return {
231
+ name: `${this.project.projectPrefix}/${type}/${entry.name}`,
232
+ path: entry.parentPath,
233
+ };
234
+ }),
235
+ );
236
+
237
+ return resources;
238
+ }
239
+
240
+ /**
241
+ * Collects all local resources.
242
+ */
243
+ public collectLocalResources() {
244
+ const resourceTypes = [
245
+ 'calculations',
246
+ 'cardTypes',
247
+ 'fieldTypes',
248
+ 'graphModels',
249
+ 'graphViews',
250
+ 'linkTypes',
251
+ 'reports',
252
+ 'templates',
253
+ 'workflows',
254
+ ] as const;
255
+
256
+ resourceTypes.forEach((type) => {
257
+ this.local[type] = this.resourcesSync(type);
258
+ });
259
+ }
260
+
261
+ /**
262
+ * Collect specific resource from modules.
263
+ * @param type Type of resource (e.g. 'templates').
264
+ * @returns array of collected items.
265
+ */
266
+ public async collectResourcesFromModules(type: ResourceFolderType) {
267
+ return (await this.addResourcesFromModules(type)).map((item) =>
268
+ stripExtension(item.name),
269
+ );
270
+ }
271
+
272
+ /**
273
+ * Add a given 'resource' to the local resource arrays.
274
+ * @param resource Resource to add.
275
+ */
276
+ public add(resource: Resource) {
277
+ // Helper to avoid adding duplicate entries.
278
+ function addItem(array: Resource[], item: Resource) {
279
+ if (!array.includes(item)) {
280
+ item.name = stripExtension(item.name);
281
+ array.push(item);
282
+ }
283
+ }
284
+
285
+ const { type } = resourceName(resource.name);
286
+ switch (type) {
287
+ case 'cardTypes':
288
+ addItem(this.local.cardTypes, resource);
289
+ break;
290
+ case 'fieldTypes':
291
+ addItem(this.local.fieldTypes, resource);
292
+ break;
293
+ case 'graphModels':
294
+ addItem(this.local.graphModels, resource);
295
+ break;
296
+ case 'graphViews':
297
+ addItem(this.local.graphViews, resource);
298
+ break;
299
+ case 'linkTypes':
300
+ addItem(this.local.linkTypes, resource);
301
+ break;
302
+ case 'reports':
303
+ addItem(this.local.reports, resource);
304
+ break;
305
+ case 'templates':
306
+ addItem(this.local.templates, resource);
307
+ break;
308
+ case 'workflows':
309
+ addItem(this.local.workflows, resource);
310
+ break;
311
+ default: {
312
+ throw new Error(`Resource type '${type}' not handled in 'addResource'`);
313
+ }
314
+ }
315
+ }
316
+
317
+ /**
318
+ * Re-collects local resources.
319
+ */
320
+ public changed() {
321
+ this.collectLocalResources();
322
+ }
323
+
324
+ /**
325
+ * Re-collects imported module resources.
326
+ */
327
+ public async moduleImported() {
328
+ this.modulesCollected = false;
329
+ }
330
+
331
+ /**
332
+ * Removes a resource from Project.
333
+ * @param resource Resource to remove.
334
+ * @returns the modified array.
335
+ */
336
+ public remove(resource: Resource) {
337
+ const { type } = resourceName(resource.name);
338
+ const arrayToModify = this.local
339
+ .resourceArray(type as ResourceFolderType)
340
+ .filter((item) => item.name !== resource.name);
341
+ this.collectLocalResources();
342
+ return arrayToModify;
343
+ }
344
+
345
+ /**
346
+ * Checks if resource of 'type' with 'name' exists.
347
+ * @param type Type of resource (e.g. 'templates').
348
+ * @param name Name of the resource.
349
+ * @returns true, if resource exits, false otherwise.
350
+ */
351
+ public async resourceExists(
352
+ type: ResourceFolderType,
353
+ name: string,
354
+ ): Promise<boolean> {
355
+ if (!name) {
356
+ return false;
357
+ }
358
+ return (await this.resources(type)).some((item) => item.name === name);
359
+ }
360
+
361
+ /**
362
+ * Returns resources of 'type'. Returned resources are either local, or from modules or all of them.
363
+ * @param type Type of resource (e.g. 'templates').
364
+ * @param from Defines where resources are collected from.
365
+ * @returns Array of resources.
366
+ */
367
+ public async resources(
368
+ type: ResourceFolderType,
369
+ from: ResourcesFrom = ResourcesFrom.all,
370
+ ): Promise<Resource[]> {
371
+ const moduleResources =
372
+ from !== ResourcesFrom.localOnly
373
+ ? await this.addResourcesFromModules(type)
374
+ : [];
375
+
376
+ const localResourcesOfType = this.localResources(type);
377
+ return this.joinResources(from, localResourcesOfType, moduleResources);
378
+ }
379
+ }