@cyberismo/data-handler 0.0.15 → 0.0.17

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 (191) hide show
  1. package/dist/card-metadata-updater.js +7 -1
  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 +22 -8
  5. package/dist/command-handler.js.map +1 -1
  6. package/dist/command-manager.d.ts +24 -1
  7. package/dist/command-manager.js +31 -7
  8. package/dist/command-manager.js.map +1 -1
  9. package/dist/commands/create.d.ts +1 -1
  10. package/dist/commands/create.js +34 -36
  11. package/dist/commands/create.js.map +1 -1
  12. package/dist/commands/export.d.ts +11 -2
  13. package/dist/commands/export.js +54 -41
  14. package/dist/commands/export.js.map +1 -1
  15. package/dist/commands/fetch.d.ts +8 -0
  16. package/dist/commands/fetch.js +101 -23
  17. package/dist/commands/fetch.js.map +1 -1
  18. package/dist/commands/import.d.ts +14 -3
  19. package/dist/commands/import.js +27 -10
  20. package/dist/commands/import.js.map +1 -1
  21. package/dist/commands/move.js +0 -1
  22. package/dist/commands/move.js.map +1 -1
  23. package/dist/commands/remove.d.ts +11 -2
  24. package/dist/commands/remove.js +15 -5
  25. package/dist/commands/remove.js.map +1 -1
  26. package/dist/commands/rename.d.ts +4 -9
  27. package/dist/commands/rename.js +37 -101
  28. package/dist/commands/rename.js.map +1 -1
  29. package/dist/commands/show.d.ts +20 -12
  30. package/dist/commands/show.js +79 -57
  31. package/dist/commands/show.js.map +1 -1
  32. package/dist/commands/transition.d.ts +9 -2
  33. package/dist/commands/transition.js +25 -17
  34. package/dist/commands/transition.js.map +1 -1
  35. package/dist/commands/update.d.ts +16 -12
  36. package/dist/commands/update.js +19 -17
  37. package/dist/commands/update.js.map +1 -1
  38. package/dist/commands/validate.d.ts +17 -9
  39. package/dist/commands/validate.js +94 -35
  40. package/dist/commands/validate.js.map +1 -1
  41. package/dist/containers/card-container.d.ts +7 -5
  42. package/dist/containers/card-container.js +30 -5
  43. package/dist/containers/card-container.js.map +1 -1
  44. package/dist/containers/project/calculation-engine.d.ts +7 -4
  45. package/dist/containers/project/calculation-engine.js +61 -66
  46. package/dist/containers/project/calculation-engine.js.map +1 -1
  47. package/dist/containers/project/project-paths.d.ts +7 -4
  48. package/dist/containers/project/project-paths.js +22 -12
  49. package/dist/containers/project/project-paths.js.map +1 -1
  50. package/dist/containers/project/resource-cache.d.ts +169 -0
  51. package/dist/containers/project/resource-cache.js +509 -0
  52. package/dist/containers/project/resource-cache.js.map +1 -0
  53. package/dist/containers/project/resource-handler.d.ts +129 -0
  54. package/dist/containers/project/resource-handler.js +206 -0
  55. package/dist/containers/project/resource-handler.js.map +1 -0
  56. package/dist/containers/project.d.ts +46 -152
  57. package/dist/containers/project.js +179 -409
  58. package/dist/containers/project.js.map +1 -1
  59. package/dist/containers/template.d.ts +8 -2
  60. package/dist/containers/template.js +24 -19
  61. package/dist/containers/template.js.map +1 -1
  62. package/dist/interfaces/command-options.d.ts +3 -1
  63. package/dist/interfaces/folder-content-interfaces.d.ts +5 -3
  64. package/dist/interfaces/folder-content-interfaces.js +3 -3
  65. package/dist/interfaces/folder-content-interfaces.js.map +1 -1
  66. package/dist/interfaces/project-interfaces.d.ts +7 -9
  67. package/dist/interfaces/project-interfaces.js.map +1 -1
  68. package/dist/interfaces/resource-interfaces.d.ts +14 -1
  69. package/dist/interfaces/resource-interfaces.js.map +1 -1
  70. package/dist/macros/graph/index.js +12 -26
  71. package/dist/macros/graph/index.js.map +1 -1
  72. package/dist/macros/index.d.ts +1 -1
  73. package/dist/macros/index.js +2 -2
  74. package/dist/macros/index.js.map +1 -1
  75. package/dist/macros/report/index.js +3 -6
  76. package/dist/macros/report/index.js.map +1 -1
  77. package/dist/module-manager.d.ts +16 -3
  78. package/dist/module-manager.js +51 -19
  79. package/dist/module-manager.js.map +1 -1
  80. package/dist/project-settings.d.ts +21 -3
  81. package/dist/project-settings.js +91 -14
  82. package/dist/project-settings.js.map +1 -1
  83. package/dist/resources/calculation-resource.d.ts +4 -3
  84. package/dist/resources/calculation-resource.js +11 -5
  85. package/dist/resources/calculation-resource.js.map +1 -1
  86. package/dist/resources/card-type-resource.d.ts +6 -1
  87. package/dist/resources/card-type-resource.js +34 -23
  88. package/dist/resources/card-type-resource.js.map +1 -1
  89. package/dist/resources/create-defaults.d.ts +3 -2
  90. package/dist/resources/create-defaults.js +3 -2
  91. package/dist/resources/create-defaults.js.map +1 -1
  92. package/dist/resources/field-type-resource.d.ts +4 -1
  93. package/dist/resources/field-type-resource.js +22 -23
  94. package/dist/resources/field-type-resource.js.map +1 -1
  95. package/dist/resources/file-resource.d.ts +5 -9
  96. package/dist/resources/file-resource.js +6 -11
  97. package/dist/resources/file-resource.js.map +1 -1
  98. package/dist/resources/folder-resource.d.ts +29 -32
  99. package/dist/resources/folder-resource.js +59 -78
  100. package/dist/resources/folder-resource.js.map +1 -1
  101. package/dist/resources/graph-model-resource.d.ts +4 -1
  102. package/dist/resources/graph-model-resource.js +11 -4
  103. package/dist/resources/graph-model-resource.js.map +1 -1
  104. package/dist/resources/graph-view-resource.d.ts +5 -2
  105. package/dist/resources/graph-view-resource.js +7 -3
  106. package/dist/resources/graph-view-resource.js.map +1 -1
  107. package/dist/resources/link-type-resource.d.ts +5 -2
  108. package/dist/resources/link-type-resource.js +5 -2
  109. package/dist/resources/link-type-resource.js.map +1 -1
  110. package/dist/resources/report-resource.d.ts +6 -7
  111. package/dist/resources/report-resource.js +14 -23
  112. package/dist/resources/report-resource.js.map +1 -1
  113. package/dist/resources/resource-object.d.ts +94 -8
  114. package/dist/resources/resource-object.js +212 -109
  115. package/dist/resources/resource-object.js.map +1 -1
  116. package/dist/resources/template-resource.d.ts +7 -3
  117. package/dist/resources/template-resource.js +10 -3
  118. package/dist/resources/template-resource.js.map +1 -1
  119. package/dist/resources/workflow-resource.d.ts +5 -2
  120. package/dist/resources/workflow-resource.js +18 -22
  121. package/dist/resources/workflow-resource.js.map +1 -1
  122. package/dist/utils/card-utils.d.ts +2 -2
  123. package/dist/utils/card-utils.js +1 -1
  124. package/dist/utils/clingo-fact-builder.d.ts +25 -14
  125. package/dist/utils/clingo-fact-builder.js +27 -5
  126. package/dist/utils/clingo-fact-builder.js.map +1 -1
  127. package/dist/utils/clingo-facts.js +3 -4
  128. package/dist/utils/clingo-facts.js.map +1 -1
  129. package/dist/utils/configuration-logger.d.ts +91 -0
  130. package/dist/utils/configuration-logger.js +151 -0
  131. package/dist/utils/configuration-logger.js.map +1 -0
  132. package/dist/utils/constants.d.ts +1 -1
  133. package/dist/utils/constants.js +5 -3
  134. package/dist/utils/constants.js.map +1 -1
  135. package/dist/utils/resource-utils.d.ts +1 -0
  136. package/dist/utils/resource-utils.js +2 -1
  137. package/dist/utils/resource-utils.js.map +1 -1
  138. package/package.json +9 -9
  139. package/src/card-metadata-updater.ts +6 -2
  140. package/src/command-handler.ts +39 -12
  141. package/src/command-manager.ts +33 -21
  142. package/src/commands/create.ts +43 -78
  143. package/src/commands/export.ts +63 -52
  144. package/src/commands/fetch.ts +143 -34
  145. package/src/commands/import.ts +37 -15
  146. package/src/commands/move.ts +0 -1
  147. package/src/commands/remove.ts +20 -7
  148. package/src/commands/rename.ts +58 -149
  149. package/src/commands/show.ts +123 -80
  150. package/src/commands/transition.ts +26 -28
  151. package/src/commands/update.ts +25 -22
  152. package/src/commands/validate.ts +104 -67
  153. package/src/containers/card-container.ts +37 -5
  154. package/src/containers/project/calculation-engine.ts +61 -93
  155. package/src/containers/project/project-paths.ts +29 -13
  156. package/src/containers/project/resource-cache.ts +651 -0
  157. package/src/containers/project/resource-handler.ts +265 -0
  158. package/src/containers/project.ts +250 -527
  159. package/src/containers/template.ts +28 -23
  160. package/src/interfaces/command-options.ts +3 -1
  161. package/src/interfaces/folder-content-interfaces.ts +7 -6
  162. package/src/interfaces/project-interfaces.ts +12 -11
  163. package/src/interfaces/resource-interfaces.ts +18 -3
  164. package/src/macros/graph/index.ts +26 -47
  165. package/src/macros/index.ts +2 -2
  166. package/src/macros/report/index.ts +3 -9
  167. package/src/module-manager.ts +74 -17
  168. package/src/project-settings.ts +96 -14
  169. package/src/resources/calculation-resource.ts +18 -18
  170. package/src/resources/card-type-resource.ts +50 -50
  171. package/src/resources/create-defaults.ts +3 -2
  172. package/src/resources/field-type-resource.ts +41 -55
  173. package/src/resources/file-resource.ts +10 -36
  174. package/src/resources/folder-resource.ts +69 -120
  175. package/src/resources/graph-model-resource.ts +20 -22
  176. package/src/resources/graph-view-resource.ts +15 -17
  177. package/src/resources/link-type-resource.ts +10 -13
  178. package/src/resources/report-resource.ts +21 -43
  179. package/src/resources/resource-object.ts +263 -149
  180. package/src/resources/template-resource.ts +17 -16
  181. package/src/resources/workflow-resource.ts +25 -44
  182. package/src/utils/card-utils.ts +2 -2
  183. package/src/utils/clingo-fact-builder.ts +28 -16
  184. package/src/utils/clingo-facts.ts +3 -4
  185. package/src/utils/configuration-logger.ts +206 -0
  186. package/src/utils/constants.ts +5 -3
  187. package/src/utils/resource-utils.ts +2 -1
  188. package/dist/containers/project/resource-collector.d.ts +0 -110
  189. package/dist/containers/project/resource-collector.js +0 -344
  190. package/dist/containers/project/resource-collector.js.map +0 -1
  191. package/src/containers/project/resource-collector.ts +0 -404
@@ -0,0 +1,509 @@
1
+ /**
2
+ Cyberismo
3
+ Copyright © Cyberismo Ltd and contributors 2025
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
+ import { dirname, extname, join } from 'node:path';
15
+ import { readdirSync, readFileSync } from 'node:fs';
16
+ import { getChildLogger } from '../../utils/log-utils.js';
17
+ import { pathToResourceName, resourceName, resourceNameToString, } from '../../utils/resource-utils.js';
18
+ import { stripExtension } from '../../utils/file-utils.js';
19
+ import { VALID_FOLDER_RESOURCE_FILES } from '../../utils/constants.js';
20
+ import { CalculationResource } from '../../resources/calculation-resource.js';
21
+ import { CardTypeResource } from '../../resources/card-type-resource.js';
22
+ import { FieldTypeResource } from '../../resources/field-type-resource.js';
23
+ import { GraphModelResource } from '../../resources/graph-model-resource.js';
24
+ import { GraphViewResource } from '../../resources/graph-view-resource.js';
25
+ import { LinkTypeResource } from '../../resources/link-type-resource.js';
26
+ import { ReportResource } from '../../resources/report-resource.js';
27
+ import { TemplateResource } from '../../resources/template-resource.js';
28
+ import { WorkflowResource } from '../../resources/workflow-resource.js';
29
+ // Defines where resources are collected from.
30
+ export var ResourcesFrom;
31
+ (function (ResourcesFrom) {
32
+ ResourcesFrom["all"] = "all";
33
+ ResourcesFrom["importedOnly"] = "imported";
34
+ ResourcesFrom["localOnly"] = "local";
35
+ })(ResourcesFrom || (ResourcesFrom = {}));
36
+ // Allowed files in resource instance data.
37
+ const allowedExtensions = ['.lp', '.json'];
38
+ // Resource types that have internal folders with content files
39
+ const FOLDER_RESOURCE_TYPES = [
40
+ 'calculations',
41
+ 'graphModels',
42
+ 'graphViews',
43
+ 'reports',
44
+ 'templates',
45
+ ];
46
+ /**
47
+ * ResourceCache handles all resource collecting, caching, and management.
48
+ * Uses a two-layered approach:
49
+ * 1. lightweight registry for collecting items that exist on disk
50
+ * 2. more complex instance cache that contains full instance data of a resource.
51
+ *
52
+ * Resource populates the first layer automatically when created.
53
+ * When new instance of a resource is created by an access function (e.g. resourceByType() or resourceByName()),
54
+ * instance of resource is saved to cache.
55
+ *
56
+ */
57
+ export class ResourceCache {
58
+ resourceRegistry = new Map();
59
+ instanceCache = new Map();
60
+ project;
61
+ // Private constructor - use ResourceCache.create() instead.
62
+ constructor(project) {
63
+ this.project = project;
64
+ }
65
+ // Initialize the cache by collecting all resources.
66
+ initialize() {
67
+ this.collectAllResources();
68
+ }
69
+ // Build a full resource name from partial name and type.
70
+ buildResourceName(name, type) {
71
+ if (type && name && name.split('/').length === 1) {
72
+ name = `${this.project.projectPrefix}/${type}/${name}`;
73
+ }
74
+ return resourceName(name);
75
+ }
76
+ // Create a resource object instance
77
+ createResourceObject(resourceName) {
78
+ const key = resourceNameToString(resourceName);
79
+ const metadata = this.resourceRegistry.get(key);
80
+ let resource;
81
+ if (resourceName.type === 'calculations') {
82
+ resource = new CalculationResource(this.project, resourceName);
83
+ }
84
+ else if (resourceName.type === 'cardTypes') {
85
+ resource = new CardTypeResource(this.project, resourceName);
86
+ }
87
+ else if (resourceName.type === 'fieldTypes') {
88
+ resource = new FieldTypeResource(this.project, resourceName);
89
+ }
90
+ else if (resourceName.type === 'graphModels') {
91
+ resource = new GraphModelResource(this.project, resourceName);
92
+ }
93
+ else if (resourceName.type === 'graphViews') {
94
+ resource = new GraphViewResource(this.project, resourceName);
95
+ }
96
+ else if (resourceName.type === 'linkTypes') {
97
+ resource = new LinkTypeResource(this.project, resourceName);
98
+ }
99
+ else if (resourceName.type === 'reports') {
100
+ resource = new ReportResource(this.project, resourceName);
101
+ }
102
+ else if (resourceName.type === 'templates') {
103
+ resource = new TemplateResource(this.project, resourceName);
104
+ }
105
+ else if (resourceName.type === 'workflows') {
106
+ resource = new WorkflowResource(this.project, resourceName);
107
+ }
108
+ else {
109
+ throw new Error(`Unsupported resource type '${resourceName.type}'`);
110
+ }
111
+ // Populate content files into folder resources
112
+ if (metadata?.contentFiles && this.hasSetContentFiles(resource)) {
113
+ resource.setContentFiles(metadata.contentFiles);
114
+ }
115
+ return resource;
116
+ }
117
+ // Collects all resources; both local and modules.
118
+ collectAllResources() {
119
+ this.collectLocalResources();
120
+ this.collectModuleResources();
121
+ }
122
+ // Collect all local resources from the filesystem
123
+ collectLocalResources() {
124
+ const resourceTypes = [
125
+ 'calculations',
126
+ 'cardTypes',
127
+ 'fieldTypes',
128
+ 'graphModels',
129
+ 'graphViews',
130
+ 'linkTypes',
131
+ 'reports',
132
+ 'templates',
133
+ 'workflows',
134
+ ];
135
+ for (const type of resourceTypes) {
136
+ this.collectResourcesOfType(type, 'local');
137
+ }
138
+ }
139
+ // Collect all module resources from the filesystem
140
+ collectModuleResources() {
141
+ try {
142
+ const moduleEntries = readdirSync(this.project.paths.modulesFolder, {
143
+ withFileTypes: true,
144
+ });
145
+ const moduleNames = moduleEntries
146
+ .filter((entry) => entry.isDirectory())
147
+ .map((entry) => entry.name);
148
+ if (moduleNames.length === 0) {
149
+ return;
150
+ }
151
+ const resourceTypes = [
152
+ 'calculations',
153
+ 'cardTypes',
154
+ 'fieldTypes',
155
+ 'graphModels',
156
+ 'graphViews',
157
+ 'linkTypes',
158
+ 'reports',
159
+ 'templates',
160
+ 'workflows',
161
+ ];
162
+ for (const moduleName of moduleNames) {
163
+ for (const type of resourceTypes) {
164
+ this.collectResourcesOfType(type, 'module', moduleName);
165
+ }
166
+ }
167
+ }
168
+ catch {
169
+ ResourceCache.logger.debug(`.cards/modules folder is missing or inaccessible`);
170
+ }
171
+ }
172
+ // Collects one folder resource's internal folder content.
173
+ collectResourceContentFiles(type, entry) {
174
+ const identifier = stripExtension(entry.name);
175
+ let contentFiles = undefined;
176
+ // Set content files for folder resources
177
+ if (FOLDER_RESOURCE_TYPES.includes(type)) {
178
+ const internalFolder = join(entry.parentPath, identifier);
179
+ try {
180
+ const contentEntries = readdirSync(internalFolder, {
181
+ withFileTypes: true,
182
+ });
183
+ const files = new Map();
184
+ for (const contentEntry of contentEntries) {
185
+ if (contentEntry.isFile() &&
186
+ VALID_FOLDER_RESOURCE_FILES.includes(contentEntry.name)) {
187
+ try {
188
+ const filePath = join(internalFolder, contentEntry.name);
189
+ const content = readFileSync(filePath, 'utf8');
190
+ files.set(contentEntry.name, content);
191
+ }
192
+ catch {
193
+ ResourceCache.logger.warn(`Failed to read content file '${contentEntry.name}' for resource '${name}'`);
194
+ }
195
+ }
196
+ }
197
+ contentFiles = files.size > 0 ? files : undefined;
198
+ }
199
+ catch {
200
+ // Internal folder doesn't exist - this is okay
201
+ }
202
+ }
203
+ return contentFiles;
204
+ }
205
+ // Collect resources of a specific type
206
+ collectResourcesOfType(type, source, moduleName) {
207
+ const resourceFolder = source === 'local'
208
+ ? this.project.paths.resourcePath(type)
209
+ : join(this.project.paths.modulesFolder, moduleName, type);
210
+ try {
211
+ const entries = readdirSync(resourceFolder, { withFileTypes: true });
212
+ for (const entry of entries) {
213
+ if (entry.isFile() && allowedExtensions.includes(extname(entry.name))) {
214
+ const name = source === 'local'
215
+ ? `${this.project.projectPrefix}/${type}/${stripExtension(entry.name)}`
216
+ : `${moduleName}/${type}/${stripExtension(entry.name)}`;
217
+ this.resourceRegistry.set(name, {
218
+ name: name,
219
+ type: type,
220
+ path: entry.parentPath,
221
+ source: source,
222
+ moduleName: source === 'module' ? moduleName : undefined,
223
+ contentFiles: this.collectResourceContentFiles(type, entry),
224
+ });
225
+ }
226
+ }
227
+ }
228
+ catch {
229
+ ResourceCache.logger.warn(`Resource folder '${resourceFolder}' is missing`);
230
+ }
231
+ }
232
+ // Removes a key from cache layers.
233
+ deleteKey(key) {
234
+ this.resourceRegistry.delete(key);
235
+ this.instanceCache.delete(key);
236
+ }
237
+ // Type guard to check if resource has setContentFiles method
238
+ hasSetContentFiles(resource) {
239
+ return (typeof resource.setContentFiles ===
240
+ 'function');
241
+ }
242
+ // Returns instance of logger.
243
+ static get logger() {
244
+ return getChildLogger({
245
+ module: 'resourceCache',
246
+ });
247
+ }
248
+ // Normalize resource name (string or ResourceName) to a consistent string format.
249
+ normalizeResourceName(name) {
250
+ if (typeof name === 'string') {
251
+ const resName = resourceName(name);
252
+ return resourceNameToString(resName);
253
+ }
254
+ return resourceNameToString(name);
255
+ }
256
+ /**
257
+ * Add a resource instance to cache. If using
258
+ * @param name Name of the resource to update
259
+ * @param instance New data for the resource.
260
+ */
261
+ addResource(name, instance) {
262
+ const key = this.normalizeResourceName(name);
263
+ if (!this.resourceRegistry.has(key)) {
264
+ const resName = typeof name === 'string' ? resourceName(name) : name;
265
+ const isModule = resName.prefix !== this.project.projectPrefix;
266
+ const resourcePath = isModule
267
+ ? this.project.paths.moduleResourcePath(resName.prefix, resName.type)
268
+ : this.project.paths.resourcePath(resName.type);
269
+ this.resourceRegistry.set(key, {
270
+ name: key,
271
+ type: resName.type,
272
+ path: resourcePath,
273
+ source: isModule ? 'module' : 'local',
274
+ moduleName: isModule ? resName.prefix : undefined,
275
+ contentFiles: undefined, // resources will set this as-needed
276
+ });
277
+ this.instanceCache.set(key, instance);
278
+ }
279
+ }
280
+ /**
281
+ * Refresh local resources in the cache.
282
+ */
283
+ changed() {
284
+ for (const [key, metadata] of this.resourceRegistry) {
285
+ if (metadata.source === 'local') {
286
+ this.resourceRegistry.delete(key);
287
+ }
288
+ }
289
+ this.collectLocalResources();
290
+ }
291
+ /**
292
+ * Refresh module resources in the cache.
293
+ * @param moduleName Name of the module. If given, will only update this modules resources.
294
+ */
295
+ changedModules(moduleName) {
296
+ for (const [key, metadata] of this.resourceRegistry) {
297
+ if (metadata.source === 'module' &&
298
+ (metadata.moduleName === moduleName || !moduleName)) {
299
+ this.resourceRegistry.delete(key);
300
+ }
301
+ }
302
+ this.collectModuleResources();
303
+ }
304
+ /**
305
+ * Change resource name in cache, but keep instance information.
306
+ * Cache has to create cache key for new and move the existing instance to it.
307
+ * @param oldName Old name of the resource
308
+ * @param newName New name of the resource
309
+ */
310
+ changeResourceName(oldName, newName) {
311
+ const oldKey = this.normalizeResourceName(oldName);
312
+ const newKey = this.normalizeResourceName(newName);
313
+ // Move instance from old key to new key if it exists
314
+ if (this.instanceCache.has(oldKey)) {
315
+ const resource = this.instanceCache.get(oldKey);
316
+ this.instanceCache.delete(oldKey);
317
+ this.instanceCache.set(newKey, resource);
318
+ }
319
+ // Update registry
320
+ const metadata = this.resourceRegistry.get(oldKey);
321
+ if (metadata) {
322
+ this.resourceRegistry.delete(oldKey);
323
+ this.resourceRegistry.set(newKey, {
324
+ ...metadata,
325
+ name: newKey,
326
+ });
327
+ }
328
+ }
329
+ /**
330
+ * Creates and initializes a ResourceCache.
331
+ * This performs filesystem I/O to collect all resources.
332
+ * @param project Project to use
333
+ * @returns Initialized ResourceCache
334
+ */
335
+ static create(project) {
336
+ const cache = new ResourceCache(project);
337
+ cache.initialize();
338
+ return cache;
339
+ }
340
+ /**
341
+ * Handle file system changes
342
+ * This is used by the Watcher in the Project class.
343
+ * @param fileName A changed file in the file system.
344
+ */
345
+ handleFileSystemChange(fileName) {
346
+ try {
347
+ const resource = pathToResourceName(this.project, fileName);
348
+ if (!resource) {
349
+ return;
350
+ }
351
+ const name = resourceNameToString(resource);
352
+ // Update registry with new path
353
+ const isModule = resource.prefix !== this.project.projectPrefix;
354
+ this.resourceRegistry.set(name, {
355
+ name: name,
356
+ type: resource.type,
357
+ path: dirname(fileName),
358
+ source: isModule ? 'module' : 'local',
359
+ moduleName: isModule ? resource.prefix : undefined,
360
+ contentFiles: undefined,
361
+ });
362
+ // Invalidate cached instance
363
+ this.invalidateResource(name);
364
+ }
365
+ catch {
366
+ ResourceCache.logger.warn(`Not a resource file: ${fileName}`);
367
+ }
368
+ }
369
+ /**
370
+ * Invalidate a resource instance.
371
+ * This forces reload on next access.
372
+ * @param name Name of the resource to invalidate.
373
+ */
374
+ invalidateResource(name) {
375
+ const key = this.normalizeResourceName(name);
376
+ // Remove from instance cache, but keep in registry
377
+ this.instanceCache.delete(key);
378
+ }
379
+ /**
380
+ * Get module names.
381
+ * @returns Module names.
382
+ */
383
+ moduleNames() {
384
+ const names = new Set();
385
+ for (const [, metadata] of this.resourceRegistry) {
386
+ if (metadata.source === 'module' && metadata.moduleName) {
387
+ names.add(metadata.moduleName);
388
+ }
389
+ }
390
+ return Array.from(names);
391
+ }
392
+ /**
393
+ * Get certain types of resources from a specific module.
394
+ * @param type Type of resource to fetch
395
+ * @param moduleName Name of the module
396
+ * @returns resources names from a specific module.
397
+ */
398
+ moduleResourceNames(type, moduleName) {
399
+ const names = [];
400
+ for (const [key, metadata] of this.resourceRegistry) {
401
+ if (metadata.type === type &&
402
+ metadata.source === 'module' &&
403
+ metadata.moduleName === moduleName) {
404
+ names.push(key);
405
+ }
406
+ }
407
+ return names;
408
+ }
409
+ /**
410
+ * Invalidate all resources of a specific module.
411
+ * @param moduleName Name of the module.
412
+ */
413
+ removeModule(moduleName) {
414
+ for (const [key, metadata] of this.resourceRegistry) {
415
+ if (metadata &&
416
+ metadata.source === 'module' &&
417
+ metadata.moduleName === moduleName) {
418
+ this.removeResource(key);
419
+ }
420
+ }
421
+ }
422
+ /**
423
+ * Remove a resource from cache. This includes both registry and instance cache.
424
+ * @param name Resource to remove.
425
+ */
426
+ removeResource(name) {
427
+ const key = this.normalizeResourceName(name);
428
+ if (!this.resourceRegistry.get(key)) {
429
+ return;
430
+ }
431
+ this.deleteKey(key);
432
+ }
433
+ /**
434
+ * Get resource with explicit type parameter
435
+ * @param name Name of the resource
436
+ * @param type Type of the resource
437
+ * @template T Resource type
438
+ * @throws If resource creation fails.
439
+ * @returns Typed resource that matches name and type.
440
+ */
441
+ resourceByType(name, type) {
442
+ const builtName = this.buildResourceName(name, type);
443
+ const key = resourceNameToString(builtName);
444
+ if (this.instanceCache.has(key)) {
445
+ return this.instanceCache.get(key);
446
+ }
447
+ const resource = this.createResourceObject(builtName);
448
+ if (!resource) {
449
+ throw new Error(`Failed to create resource '${key}'`);
450
+ }
451
+ if (this.resourceRegistry.has(key)) {
452
+ this.instanceCache.set(key, resource);
453
+ }
454
+ return resource;
455
+ }
456
+ /**
457
+ * Get resource by ResourceName object
458
+ * @param name Resource name.
459
+ * @throws If resource creation fails.
460
+ * @returns Typed resource that matches the name.
461
+ */
462
+ resourceByName(name) {
463
+ const key = resourceNameToString(name);
464
+ if (this.instanceCache.has(key)) {
465
+ return this.instanceCache.get(key);
466
+ }
467
+ const resource = this.createResourceObject(name);
468
+ if (!resource) {
469
+ throw new Error(`Failed to create resource '${key}'`);
470
+ }
471
+ if (this.resourceRegistry.has(key)) {
472
+ this.instanceCache.set(key, resource);
473
+ }
474
+ return resource;
475
+ }
476
+ /**
477
+ * Check if a resource exists.
478
+ * @param name Resource name to check.
479
+ * @returns true, if resource is in the cache; false otherwise.
480
+ */
481
+ has(name) {
482
+ const key = this.normalizeResourceName(name);
483
+ return this.resourceRegistry.has(key);
484
+ }
485
+ /**
486
+ * Get resources with full metadata for a specific type
487
+ * @param type Type of resources to get.
488
+ * @param from Where to return resources from (all, local, imported modules)
489
+ * @template T Resource type
490
+ * @returns Array of resources with metadata.
491
+ */
492
+ resources(type, from = ResourcesFrom.all) {
493
+ const resources = [];
494
+ for (const [key, metadata] of this.resourceRegistry) {
495
+ if (metadata.type !== type)
496
+ continue;
497
+ if (from === ResourcesFrom.localOnly && metadata.source !== 'local')
498
+ continue;
499
+ if (from === ResourcesFrom.importedOnly && metadata.source !== 'module')
500
+ continue;
501
+ // Get or create the actual resource instance
502
+ const resName = resourceName(key);
503
+ const resource = this.resourceByName(resName);
504
+ resources.push(resource);
505
+ }
506
+ return resources;
507
+ }
508
+ }
509
+ //# sourceMappingURL=resource-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-cache.js","sourceRoot":"","sources":["../../../src/containers/project/resource-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ Cyberismo
3
+ Copyright © Cyberismo Ltd and contributors 2025
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
+ import { ResourcesFrom, type ResourceMap } from './resource-cache.js';
15
+ import type { Project } from '../project.js';
16
+ import type { ResourceFolderType } from '../../interfaces/project-interfaces.js';
17
+ import type { ResourceName } from '../../utils/resource-utils.js';
18
+ export declare const singularToPluralResourceType: Record<string, keyof ResourceMap>;
19
+ /**
20
+ * ResourceHandler manages resource access for a project.
21
+ * It owns the ResourceCache and provides APIs for accessing resources.
22
+ */
23
+ export declare class ResourceHandler {
24
+ private cache;
25
+ /**
26
+ * Creates instance of ResourceHandler.
27
+ * @param project Project to use in cache
28
+ */
29
+ constructor(project: Project);
30
+ /**
31
+ * Add a resource to the cache.
32
+ * @param name Name of the resource to add
33
+ * @param instance Resource instance
34
+ */
35
+ add(name: string | ResourceName, instance: unknown): void;
36
+ byType<T extends keyof ResourceMap>(name: string, type: T): ResourceMap[T];
37
+ /**
38
+ * Overload to the above: Accept resource name
39
+ * @param resourceName Name of resource as a resource name (prefix/type/identifier)
40
+ * @template T Resource type
41
+ * @returns resource with inferred actual type.
42
+ */
43
+ byType<T extends keyof ResourceMap>(resourceName: ResourceName): ResourceMap[T];
44
+ /**
45
+ * Get resource by ResourceName object.
46
+ * @param name Resource name
47
+ * @template T Resource type
48
+ * @returns Typed resource that matches the name
49
+ */
50
+ byName<T extends keyof ResourceMap>(name: ResourceName): ResourceMap[T];
51
+ /**
52
+ * Refresh local resources in the cache.
53
+ */
54
+ changed(): void;
55
+ /**
56
+ * Refresh module resources in the cache.
57
+ * @param moduleName Name of the module. If given, will only update this module's resources.
58
+ */
59
+ changedModules(moduleName?: string): void;
60
+ /**
61
+ * Check if a resource exists.
62
+ * @param name Resource name to check
63
+ * @returns true if resource exists, false otherwise
64
+ */
65
+ exists(name: string | ResourceName): boolean;
66
+ /**
67
+ * Get module names.
68
+ * @returns Array of module names
69
+ */
70
+ moduleNames(): string[];
71
+ /**
72
+ * Get certain types of resources from a specific module.
73
+ * @param type Type of resource to fetch
74
+ * @param moduleName Name of the module
75
+ * @returns Resource names from a specific module
76
+ */
77
+ moduleResourceNames(type: ResourceFolderType, moduleName: string): string[];
78
+ /**
79
+ * Remove a resource from cache.
80
+ * @param name Resource to remove
81
+ */
82
+ remove(name: string | ResourceName): void;
83
+ /**
84
+ * Removes all resources from a specific module.
85
+ * @param moduleName Name of the module
86
+ */
87
+ removeModule(moduleName: string): void;
88
+ /**
89
+ * Change resource name in cache, but keep instance information.
90
+ * @param oldName Old name of the resource
91
+ * @param newName New name of the resource
92
+ */
93
+ rename(oldName: string, newName: string): void;
94
+ /**
95
+ * Get resources of a specific type.
96
+ * @param type Type of resources to get
97
+ * @param from Where to return resources from (all, local, imported modules)
98
+ * @template T Resource type
99
+ * @returns Array of resources
100
+ */
101
+ resourceTypes<T extends keyof ResourceMap>(type: T, from?: ResourcesFrom): Array<ResourceMap[T]>;
102
+ calculations(from?: ResourcesFrom): import("../../resources/calculation-resource.js").CalculationResource[];
103
+ cardTypes(from?: ResourcesFrom): import("../../resources/card-type-resource.js").CardTypeResource[];
104
+ fieldTypes(from?: ResourcesFrom): import("../../resources/field-type-resource.js").FieldTypeResource[];
105
+ graphViews(from?: ResourcesFrom): import("../../resources/graph-view-resource.js").GraphViewResource[];
106
+ graphModels(from?: ResourcesFrom): import("../../resources/graph-model-resource.js").GraphModelResource[];
107
+ linkTypes(from?: ResourcesFrom): import("../../resources/link-type-resource.js").LinkTypeResource[];
108
+ reports(from?: ResourcesFrom): import("../../resources/report-resource.js").ReportResource[];
109
+ templates(from?: ResourcesFrom): import("../../resources/template-resource.js").TemplateResource[];
110
+ workflows(from?: ResourcesFrom): import("../../resources/workflow-resource.js").WorkflowResource[];
111
+ /**
112
+ * Extract resource type from a resource name string.
113
+ * @param name Resource name
114
+ * @returns Resource type
115
+ * @throws when resource type is invalid
116
+ */
117
+ extractType(name: string): keyof ResourceMap;
118
+ /**
119
+ * Handle file system changes.
120
+ * @param fileName A changed file in the file system
121
+ */
122
+ handleFileSystemChange(fileName: string): void;
123
+ /**
124
+ * Get plural resource type name from singular type name.
125
+ * @param singular Resource type as singular name
126
+ * @returns Resource type as plural name
127
+ */
128
+ resourceTypeFromSingularType(singular: string): keyof ResourceMap;
129
+ }