@kapeta/local-cluster-service 0.0.0-96f91ef

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 (274) hide show
  1. package/.eslintrc.cjs +25 -0
  2. package/.github/workflows/check-license.yml +17 -0
  3. package/.github/workflows/main.yml +26 -0
  4. package/.prettierignore +4 -0
  5. package/.vscode/launch.json +19 -0
  6. package/CHANGELOG.md +920 -0
  7. package/LICENSE +38 -0
  8. package/README.md +36 -0
  9. package/definitions.d.ts +35 -0
  10. package/dist/cjs/index.d.ts +34 -0
  11. package/dist/cjs/index.js +263 -0
  12. package/dist/cjs/package.json +1 -0
  13. package/dist/cjs/src/RepositoryWatcher.d.ts +30 -0
  14. package/dist/cjs/src/RepositoryWatcher.js +332 -0
  15. package/dist/cjs/src/ai/aiClient.d.ts +20 -0
  16. package/dist/cjs/src/ai/aiClient.js +74 -0
  17. package/dist/cjs/src/ai/routes.d.ts +7 -0
  18. package/dist/cjs/src/ai/routes.js +37 -0
  19. package/dist/cjs/src/ai/transform.d.ts +11 -0
  20. package/dist/cjs/src/ai/transform.js +239 -0
  21. package/dist/cjs/src/ai/types.d.ts +40 -0
  22. package/dist/cjs/src/ai/types.js +2 -0
  23. package/dist/cjs/src/api.d.ts +7 -0
  24. package/dist/cjs/src/api.js +29 -0
  25. package/dist/cjs/src/assetManager.d.ts +41 -0
  26. package/dist/cjs/src/assetManager.js +274 -0
  27. package/dist/cjs/src/assets/routes.d.ts +7 -0
  28. package/dist/cjs/src/assets/routes.js +165 -0
  29. package/dist/cjs/src/attachments/routes.d.ts +7 -0
  30. package/dist/cjs/src/attachments/routes.js +72 -0
  31. package/dist/cjs/src/authManager.d.ts +16 -0
  32. package/dist/cjs/src/authManager.js +64 -0
  33. package/dist/cjs/src/cacheManager.d.ts +20 -0
  34. package/dist/cjs/src/cacheManager.js +51 -0
  35. package/dist/cjs/src/clusterService.d.ts +44 -0
  36. package/dist/cjs/src/clusterService.js +120 -0
  37. package/dist/cjs/src/codeGeneratorManager.d.ts +14 -0
  38. package/dist/cjs/src/codeGeneratorManager.js +93 -0
  39. package/dist/cjs/src/config/routes.d.ts +7 -0
  40. package/dist/cjs/src/config/routes.js +160 -0
  41. package/dist/cjs/src/configManager.d.ts +42 -0
  42. package/dist/cjs/src/configManager.js +136 -0
  43. package/dist/cjs/src/containerManager.d.ts +148 -0
  44. package/dist/cjs/src/containerManager.js +958 -0
  45. package/dist/cjs/src/definitionsManager.d.ts +20 -0
  46. package/dist/cjs/src/definitionsManager.js +171 -0
  47. package/dist/cjs/src/filesystem/routes.d.ts +7 -0
  48. package/dist/cjs/src/filesystem/routes.js +105 -0
  49. package/dist/cjs/src/filesystemManager.d.ts +27 -0
  50. package/dist/cjs/src/filesystemManager.js +118 -0
  51. package/dist/cjs/src/identities/routes.d.ts +7 -0
  52. package/dist/cjs/src/identities/routes.js +37 -0
  53. package/dist/cjs/src/instanceManager.d.ts +69 -0
  54. package/dist/cjs/src/instanceManager.js +910 -0
  55. package/dist/cjs/src/instances/routes.d.ts +7 -0
  56. package/dist/cjs/src/instances/routes.js +179 -0
  57. package/dist/cjs/src/middleware/cors.d.ts +6 -0
  58. package/dist/cjs/src/middleware/cors.js +14 -0
  59. package/dist/cjs/src/middleware/kapeta.d.ts +15 -0
  60. package/dist/cjs/src/middleware/kapeta.js +28 -0
  61. package/dist/cjs/src/middleware/stringBody.d.ts +9 -0
  62. package/dist/cjs/src/middleware/stringBody.js +18 -0
  63. package/dist/cjs/src/networkManager.d.ts +37 -0
  64. package/dist/cjs/src/networkManager.js +119 -0
  65. package/dist/cjs/src/operatorManager.d.ts +41 -0
  66. package/dist/cjs/src/operatorManager.js +211 -0
  67. package/dist/cjs/src/progressListener.d.ts +31 -0
  68. package/dist/cjs/src/progressListener.js +133 -0
  69. package/dist/cjs/src/providerManager.d.ts +11 -0
  70. package/dist/cjs/src/providerManager.js +84 -0
  71. package/dist/cjs/src/providers/routes.d.ts +7 -0
  72. package/dist/cjs/src/providers/routes.js +46 -0
  73. package/dist/cjs/src/proxy/routes.d.ts +7 -0
  74. package/dist/cjs/src/proxy/routes.js +115 -0
  75. package/dist/cjs/src/proxy/types/rest.d.ts +10 -0
  76. package/dist/cjs/src/proxy/types/rest.js +123 -0
  77. package/dist/cjs/src/proxy/types/web.d.ts +8 -0
  78. package/dist/cjs/src/proxy/types/web.js +61 -0
  79. package/dist/cjs/src/repositoryManager.d.ts +35 -0
  80. package/dist/cjs/src/repositoryManager.js +247 -0
  81. package/dist/cjs/src/serviceManager.d.ts +36 -0
  82. package/dist/cjs/src/serviceManager.js +106 -0
  83. package/dist/cjs/src/socketManager.d.ts +32 -0
  84. package/dist/cjs/src/socketManager.js +125 -0
  85. package/dist/cjs/src/storageService.d.ts +21 -0
  86. package/dist/cjs/src/storageService.js +81 -0
  87. package/dist/cjs/src/taskManager.d.ts +70 -0
  88. package/dist/cjs/src/taskManager.js +181 -0
  89. package/dist/cjs/src/tasks/routes.d.ts +7 -0
  90. package/dist/cjs/src/tasks/routes.js +39 -0
  91. package/dist/cjs/src/traffic/routes.d.ts +7 -0
  92. package/dist/cjs/src/traffic/routes.js +22 -0
  93. package/dist/cjs/src/types.d.ts +99 -0
  94. package/dist/cjs/src/types.js +39 -0
  95. package/dist/cjs/src/utils/BlockInstanceRunner.d.ts +28 -0
  96. package/dist/cjs/src/utils/BlockInstanceRunner.js +432 -0
  97. package/dist/cjs/src/utils/DefaultProviderInstaller.d.ts +15 -0
  98. package/dist/cjs/src/utils/DefaultProviderInstaller.js +136 -0
  99. package/dist/cjs/src/utils/InternalConfigProvider.d.ts +38 -0
  100. package/dist/cjs/src/utils/InternalConfigProvider.js +146 -0
  101. package/dist/cjs/src/utils/LogData.d.ts +23 -0
  102. package/dist/cjs/src/utils/LogData.js +46 -0
  103. package/dist/cjs/src/utils/commandLineUtils.d.ts +8 -0
  104. package/dist/cjs/src/utils/commandLineUtils.js +39 -0
  105. package/dist/cjs/src/utils/pathTemplateParser.d.ts +30 -0
  106. package/dist/cjs/src/utils/pathTemplateParser.js +135 -0
  107. package/dist/cjs/src/utils/utils.d.ts +40 -0
  108. package/dist/cjs/src/utils/utils.js +148 -0
  109. package/dist/cjs/start.d.ts +5 -0
  110. package/dist/cjs/start.js +17 -0
  111. package/dist/cjs/test/proxy/types/rest.test.d.ts +5 -0
  112. package/dist/cjs/test/proxy/types/rest.test.js +48 -0
  113. package/dist/cjs/test/utils/pathTemplateParser.test.d.ts +5 -0
  114. package/dist/cjs/test/utils/pathTemplateParser.test.js +27 -0
  115. package/dist/esm/index.d.ts +34 -0
  116. package/dist/esm/index.js +263 -0
  117. package/dist/esm/package.json +1 -0
  118. package/dist/esm/src/RepositoryWatcher.d.ts +30 -0
  119. package/dist/esm/src/RepositoryWatcher.js +332 -0
  120. package/dist/esm/src/ai/aiClient.d.ts +20 -0
  121. package/dist/esm/src/ai/aiClient.js +74 -0
  122. package/dist/esm/src/ai/routes.d.ts +7 -0
  123. package/dist/esm/src/ai/routes.js +37 -0
  124. package/dist/esm/src/ai/transform.d.ts +11 -0
  125. package/dist/esm/src/ai/transform.js +239 -0
  126. package/dist/esm/src/ai/types.d.ts +40 -0
  127. package/dist/esm/src/ai/types.js +2 -0
  128. package/dist/esm/src/api.d.ts +7 -0
  129. package/dist/esm/src/api.js +29 -0
  130. package/dist/esm/src/assetManager.d.ts +41 -0
  131. package/dist/esm/src/assetManager.js +274 -0
  132. package/dist/esm/src/assets/routes.d.ts +7 -0
  133. package/dist/esm/src/assets/routes.js +165 -0
  134. package/dist/esm/src/attachments/routes.d.ts +7 -0
  135. package/dist/esm/src/attachments/routes.js +72 -0
  136. package/dist/esm/src/authManager.d.ts +16 -0
  137. package/dist/esm/src/authManager.js +64 -0
  138. package/dist/esm/src/cacheManager.d.ts +20 -0
  139. package/dist/esm/src/cacheManager.js +51 -0
  140. package/dist/esm/src/clusterService.d.ts +44 -0
  141. package/dist/esm/src/clusterService.js +120 -0
  142. package/dist/esm/src/codeGeneratorManager.d.ts +14 -0
  143. package/dist/esm/src/codeGeneratorManager.js +93 -0
  144. package/dist/esm/src/config/routes.d.ts +7 -0
  145. package/dist/esm/src/config/routes.js +160 -0
  146. package/dist/esm/src/configManager.d.ts +42 -0
  147. package/dist/esm/src/configManager.js +136 -0
  148. package/dist/esm/src/containerManager.d.ts +148 -0
  149. package/dist/esm/src/containerManager.js +958 -0
  150. package/dist/esm/src/definitionsManager.d.ts +20 -0
  151. package/dist/esm/src/definitionsManager.js +171 -0
  152. package/dist/esm/src/filesystem/routes.d.ts +7 -0
  153. package/dist/esm/src/filesystem/routes.js +105 -0
  154. package/dist/esm/src/filesystemManager.d.ts +27 -0
  155. package/dist/esm/src/filesystemManager.js +118 -0
  156. package/dist/esm/src/identities/routes.d.ts +7 -0
  157. package/dist/esm/src/identities/routes.js +37 -0
  158. package/dist/esm/src/instanceManager.d.ts +69 -0
  159. package/dist/esm/src/instanceManager.js +910 -0
  160. package/dist/esm/src/instances/routes.d.ts +7 -0
  161. package/dist/esm/src/instances/routes.js +179 -0
  162. package/dist/esm/src/middleware/cors.d.ts +6 -0
  163. package/dist/esm/src/middleware/cors.js +14 -0
  164. package/dist/esm/src/middleware/kapeta.d.ts +15 -0
  165. package/dist/esm/src/middleware/kapeta.js +28 -0
  166. package/dist/esm/src/middleware/stringBody.d.ts +9 -0
  167. package/dist/esm/src/middleware/stringBody.js +18 -0
  168. package/dist/esm/src/networkManager.d.ts +37 -0
  169. package/dist/esm/src/networkManager.js +119 -0
  170. package/dist/esm/src/operatorManager.d.ts +41 -0
  171. package/dist/esm/src/operatorManager.js +211 -0
  172. package/dist/esm/src/progressListener.d.ts +31 -0
  173. package/dist/esm/src/progressListener.js +133 -0
  174. package/dist/esm/src/providerManager.d.ts +11 -0
  175. package/dist/esm/src/providerManager.js +84 -0
  176. package/dist/esm/src/providers/routes.d.ts +7 -0
  177. package/dist/esm/src/providers/routes.js +46 -0
  178. package/dist/esm/src/proxy/routes.d.ts +7 -0
  179. package/dist/esm/src/proxy/routes.js +115 -0
  180. package/dist/esm/src/proxy/types/rest.d.ts +10 -0
  181. package/dist/esm/src/proxy/types/rest.js +123 -0
  182. package/dist/esm/src/proxy/types/web.d.ts +8 -0
  183. package/dist/esm/src/proxy/types/web.js +61 -0
  184. package/dist/esm/src/repositoryManager.d.ts +35 -0
  185. package/dist/esm/src/repositoryManager.js +247 -0
  186. package/dist/esm/src/serviceManager.d.ts +36 -0
  187. package/dist/esm/src/serviceManager.js +106 -0
  188. package/dist/esm/src/socketManager.d.ts +32 -0
  189. package/dist/esm/src/socketManager.js +125 -0
  190. package/dist/esm/src/storageService.d.ts +21 -0
  191. package/dist/esm/src/storageService.js +81 -0
  192. package/dist/esm/src/taskManager.d.ts +70 -0
  193. package/dist/esm/src/taskManager.js +181 -0
  194. package/dist/esm/src/tasks/routes.d.ts +7 -0
  195. package/dist/esm/src/tasks/routes.js +39 -0
  196. package/dist/esm/src/traffic/routes.d.ts +7 -0
  197. package/dist/esm/src/traffic/routes.js +22 -0
  198. package/dist/esm/src/types.d.ts +99 -0
  199. package/dist/esm/src/types.js +39 -0
  200. package/dist/esm/src/utils/BlockInstanceRunner.d.ts +28 -0
  201. package/dist/esm/src/utils/BlockInstanceRunner.js +432 -0
  202. package/dist/esm/src/utils/DefaultProviderInstaller.d.ts +15 -0
  203. package/dist/esm/src/utils/DefaultProviderInstaller.js +136 -0
  204. package/dist/esm/src/utils/InternalConfigProvider.d.ts +38 -0
  205. package/dist/esm/src/utils/InternalConfigProvider.js +146 -0
  206. package/dist/esm/src/utils/LogData.d.ts +23 -0
  207. package/dist/esm/src/utils/LogData.js +46 -0
  208. package/dist/esm/src/utils/commandLineUtils.d.ts +8 -0
  209. package/dist/esm/src/utils/commandLineUtils.js +39 -0
  210. package/dist/esm/src/utils/pathTemplateParser.d.ts +30 -0
  211. package/dist/esm/src/utils/pathTemplateParser.js +135 -0
  212. package/dist/esm/src/utils/utils.d.ts +40 -0
  213. package/dist/esm/src/utils/utils.js +148 -0
  214. package/dist/esm/start.d.ts +5 -0
  215. package/dist/esm/start.js +17 -0
  216. package/dist/esm/test/proxy/types/rest.test.d.ts +5 -0
  217. package/dist/esm/test/proxy/types/rest.test.js +48 -0
  218. package/dist/esm/test/utils/pathTemplateParser.test.d.ts +5 -0
  219. package/dist/esm/test/utils/pathTemplateParser.test.js +27 -0
  220. package/index.ts +280 -0
  221. package/jest.config.js +8 -0
  222. package/package.json +134 -0
  223. package/src/RepositoryWatcher.ts +363 -0
  224. package/src/ai/aiClient.ts +93 -0
  225. package/src/ai/routes.ts +39 -0
  226. package/src/ai/transform.ts +275 -0
  227. package/src/ai/types.ts +45 -0
  228. package/src/api.ts +32 -0
  229. package/src/assetManager.ts +355 -0
  230. package/src/assets/routes.ts +183 -0
  231. package/src/attachments/routes.ts +79 -0
  232. package/src/authManager.ts +67 -0
  233. package/src/cacheManager.ts +59 -0
  234. package/src/clusterService.ts +142 -0
  235. package/src/codeGeneratorManager.ts +109 -0
  236. package/src/config/routes.ts +201 -0
  237. package/src/configManager.ts +180 -0
  238. package/src/containerManager.ts +1178 -0
  239. package/src/definitionsManager.ts +212 -0
  240. package/src/filesystem/routes.ts +123 -0
  241. package/src/filesystemManager.ts +133 -0
  242. package/src/identities/routes.ts +38 -0
  243. package/src/instanceManager.ts +1160 -0
  244. package/src/instances/routes.ts +203 -0
  245. package/src/middleware/cors.ts +14 -0
  246. package/src/middleware/kapeta.ts +41 -0
  247. package/src/middleware/stringBody.ts +21 -0
  248. package/src/networkManager.ts +148 -0
  249. package/src/operatorManager.ts +294 -0
  250. package/src/progressListener.ts +151 -0
  251. package/src/providerManager.ts +97 -0
  252. package/src/providers/routes.ts +51 -0
  253. package/src/proxy/routes.ts +153 -0
  254. package/src/proxy/types/rest.ts +172 -0
  255. package/src/proxy/types/web.ts +70 -0
  256. package/src/repositoryManager.ts +291 -0
  257. package/src/serviceManager.ts +133 -0
  258. package/src/socketManager.ts +138 -0
  259. package/src/storageService.ts +97 -0
  260. package/src/taskManager.ts +247 -0
  261. package/src/tasks/routes.ts +43 -0
  262. package/src/traffic/routes.ts +23 -0
  263. package/src/types.ts +112 -0
  264. package/src/utils/BlockInstanceRunner.ts +577 -0
  265. package/src/utils/DefaultProviderInstaller.ts +150 -0
  266. package/src/utils/InternalConfigProvider.ts +214 -0
  267. package/src/utils/LogData.ts +50 -0
  268. package/src/utils/commandLineUtils.ts +45 -0
  269. package/src/utils/pathTemplateParser.ts +157 -0
  270. package/src/utils/utils.ts +155 -0
  271. package/start.ts +14 -0
  272. package/test/proxy/types/rest.test.ts +54 -0
  273. package/test/utils/pathTemplateParser.test.ts +29 -0
  274. package/tsconfig.json +15 -0
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+
6
+ import ClusterConfiguration, { DefinitionInfo } from '@kapeta/local-cluster-config';
7
+ import { parseKapetaUri, normalizeKapetaUri, parseVersion } from '@kapeta/nodejs-utils';
8
+ import { cacheManager, doCached } from './cacheManager';
9
+ import { ExtendedIdentity, KapetaAPI } from '@kapeta/nodejs-api-client';
10
+ import { Plan } from '@kapeta/schemas';
11
+ import FS from 'fs-extra';
12
+ import YAML from 'yaml';
13
+ import { Actions } from '@kapeta/nodejs-registry-utils';
14
+ import { ProgressListener } from './progressListener';
15
+ import Path from 'path';
16
+
17
+ export const SAMPLE_PLAN_NAME = 'kapeta/sample-java-chat-plan';
18
+
19
+ function getRenamed(definition: DefinitionInfo, targetHandle: string) {
20
+ const originalUri = parseKapetaUri(definition.definition.metadata.name);
21
+ return `${targetHandle}/${originalUri.name}`;
22
+ }
23
+ function applyHandleChange(definition: DefinitionInfo, targetHandle: string) {
24
+ definition.definition.metadata.name = getRenamed(definition, targetHandle);
25
+ // We also change the visibility to private
26
+ definition.definition.metadata.visibility = 'private';
27
+ return definition;
28
+ }
29
+
30
+ function normalizeFilters(kindFilter?: string | string[]) {
31
+ let resolvedFilters: string[] = [];
32
+
33
+ if (kindFilter) {
34
+ if (Array.isArray(kindFilter)) {
35
+ resolvedFilters = [...kindFilter];
36
+ } else {
37
+ resolvedFilters = [kindFilter];
38
+ }
39
+ }
40
+
41
+ return resolvedFilters.map((k) => k.toLowerCase());
42
+ }
43
+
44
+ class DefinitionsManager {
45
+ private async resolveDefinitionsAndSamples() {
46
+ const definitions = ClusterConfiguration.getDefinitions();
47
+ const samplePlan = definitions.find(
48
+ (d) => d.version === 'local' && d.definition.metadata.name === SAMPLE_PLAN_NAME
49
+ );
50
+
51
+ if (!samplePlan) {
52
+ return definitions;
53
+ }
54
+
55
+ // We will only rewrite the sample plan once since we change the handle to be the users handle
56
+ const api = new KapetaAPI();
57
+ if (!api.hasToken()) {
58
+ // Not logged in yet, so we can't rewrite the sample plan
59
+ return definitions;
60
+ }
61
+
62
+ const profile = await api.getCurrentIdentity();
63
+ if (!profile) {
64
+ // Not logged in yet, so we can't rewrite the sample plan
65
+ return definitions;
66
+ }
67
+
68
+ try {
69
+ await this.prepareSample(definitions, samplePlan, profile);
70
+ } catch (e) {
71
+ console.warn('Failed to prepare sample plan', e);
72
+ }
73
+
74
+ // Return the rewritten definitions
75
+ return ClusterConfiguration.getDefinitions();
76
+ }
77
+
78
+ private async prepareSample(definitions: DefinitionInfo[], samplePlan: DefinitionInfo, profile: ExtendedIdentity) {
79
+ const newName = getRenamed(samplePlan, profile.handle);
80
+
81
+ if (definitions.some((d) => d.definition.metadata.name === newName && d.version === 'local')) {
82
+ // We already have a local version of the sample plan
83
+ return definitions;
84
+ }
85
+
86
+ console.log('Rewriting sample plan to use handle %s', profile.handle);
87
+ applyHandleChange(samplePlan, profile.handle);
88
+ const planDef = samplePlan.definition as Plan;
89
+
90
+ const blockRefs = new Set<string>();
91
+
92
+ planDef.spec.blocks.forEach((b) => {
93
+ const blockUri = parseKapetaUri(b.block.ref);
94
+ if (blockUri.version === 'local') {
95
+ blockRefs.add(blockUri.id);
96
+ b.block.ref = normalizeKapetaUri(`${profile.handle}/${blockUri.name}:local`);
97
+ }
98
+ });
99
+
100
+ // Rewrite all blocks that are referenced by the sample plan
101
+ const rewrittenBlocks = Array.from(blockRefs)
102
+ .map((ref) =>
103
+ definitions.find(
104
+ (d) => normalizeKapetaUri(d.definition.metadata.name + ':' + d.version) === normalizeKapetaUri(ref)
105
+ )
106
+ )
107
+ .filter((d) => d !== undefined)
108
+ .map((d) => applyHandleChange(d!, profile.handle));
109
+
110
+ // Persist the rewritten assets
111
+ const progressListener = new ProgressListener();
112
+ const rewrittenAssets = [samplePlan, ...rewrittenBlocks];
113
+ const originalRefs = [`${SAMPLE_PLAN_NAME}:local`, ...Array.from(blockRefs)];
114
+
115
+ // Store the original paths on the assets - we'll need them later
116
+ for (const asset of rewrittenAssets) {
117
+ asset.path = await FS.readlink(asset.path);
118
+ asset.ymlPath = Path.join(asset.path, Path.basename(asset.ymlPath));
119
+ }
120
+
121
+ // Uninstall the original assets
122
+ // This removes the symlinks
123
+ console.log('Uninstalling original assets', originalRefs);
124
+ try {
125
+ await Actions.uninstall(progressListener, originalRefs);
126
+ } catch (err) {
127
+ console.warn('Failed to uninstall original assets', err);
128
+ }
129
+
130
+ for (const asset of rewrittenAssets) {
131
+ console.log('Updating %s ', asset.ymlPath);
132
+ await FS.writeFile(asset.ymlPath, YAML.stringify(asset.definition));
133
+
134
+ console.log('Linking %s ', asset.path);
135
+ await Actions.link(progressListener, asset.path);
136
+ }
137
+
138
+ console.log('Rewrite done for sample plan');
139
+ }
140
+
141
+ private applyFilters(definitions: DefinitionInfo[], kindFilter: string[]): DefinitionInfo[] {
142
+ if (kindFilter.length === 0) {
143
+ return definitions;
144
+ }
145
+
146
+ return definitions.filter((d) => {
147
+ return kindFilter.includes(d.definition.kind.toLowerCase());
148
+ });
149
+ }
150
+
151
+ public async getDefinitions(kindFilter?: string | string[]): Promise<DefinitionInfo[]> {
152
+ kindFilter = normalizeFilters(kindFilter);
153
+
154
+ const definitions = await doCached<Promise<DefinitionInfo[]>>('definitionsManager:all', () =>
155
+ this.resolveDefinitionsAndSamples()
156
+ );
157
+
158
+ return this.applyFilters(definitions, kindFilter);
159
+ }
160
+
161
+ public async exists(ref: string) {
162
+ return !!(await this.getDefinition(ref));
163
+ }
164
+
165
+ public async getProviderDefinitions(): Promise<DefinitionInfo[]> {
166
+ return doCached<DefinitionInfo[]>('definitionsManager:providers', () =>
167
+ ClusterConfiguration.getProviderDefinitions()
168
+ );
169
+ }
170
+
171
+ public async getDefinition(ref: string) {
172
+ const uri = parseKapetaUri(ref);
173
+ const definitions = await this.getDefinitions();
174
+ return definitions.find((d) => {
175
+ if (!uri.version) {
176
+ return d.definition.metadata.name.toLowerCase() === uri.fullName.toLowerCase();
177
+ }
178
+ return parseKapetaUri(`${d.definition.metadata.name}:${d.version}`).equals(uri);
179
+ });
180
+ }
181
+
182
+ public async getLatestDefinition(name: string) {
183
+ const definitions = await this.getDefinitions();
184
+ const allVersions = definitions.filter((d) => {
185
+ return d.version !== 'local' && d.definition.metadata.name === name;
186
+ });
187
+
188
+ if (allVersions.length === 0) {
189
+ return;
190
+ }
191
+
192
+ allVersions.sort((a, b) => {
193
+ return parseVersion(a.version).compareTo(parseVersion(b.version)) * -1;
194
+ });
195
+
196
+ return allVersions[0];
197
+ }
198
+
199
+ public async getVersions(assetName: string) {
200
+ const uri = parseKapetaUri(assetName);
201
+ const definitions = await this.getDefinitions();
202
+ return definitions.filter((d) => {
203
+ return d.definition.metadata.name === uri.fullName;
204
+ });
205
+ }
206
+
207
+ public clearCache() {
208
+ cacheManager.removePrefix('definitionsManager:');
209
+ }
210
+ }
211
+
212
+ export const definitionsManager = new DefinitionsManager();
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+
6
+ import Router from 'express-promise-router';
7
+ import { stringBody, StringBodyRequest } from '../middleware/stringBody';
8
+ import { filesystemManager } from '../filesystemManager';
9
+ import { corsHandler } from '../middleware/cors';
10
+ import { NextFunction, Request, Response } from 'express';
11
+
12
+ let router = Router();
13
+
14
+ router.use('/', corsHandler);
15
+
16
+ router.get('/root', (req: Request, res: Response) => {
17
+ res.send(filesystemManager.getRootFolder());
18
+ });
19
+
20
+ router.get('/project/root', (req: Request, res: Response) => {
21
+ res.send(filesystemManager.getProjectRootFolder());
22
+ });
23
+
24
+ router.use('/project/root', stringBody);
25
+
26
+ router.post('/project/root', (req: StringBodyRequest, res: Response) => {
27
+ filesystemManager.setProjectRootFolder(req.stringBody ?? '');
28
+ res.sendStatus(204);
29
+ });
30
+
31
+ router.get('/editor', (req: Request, res: Response) => {
32
+ res.send(filesystemManager.getEditor());
33
+ });
34
+
35
+ router.use('/editor', stringBody);
36
+
37
+ router.post('/editor', (req: StringBodyRequest, res: Response) => {
38
+ filesystemManager.setEditor(req.stringBody ?? '');
39
+ res.sendStatus(204);
40
+ });
41
+
42
+ router.get('/release-channel', (req: Request, res: Response) => {
43
+ res.send(filesystemManager.getReleaseChannel());
44
+ });
45
+
46
+ router.use('/release-channel', stringBody);
47
+
48
+ router.post('/release-channel', (req: StringBodyRequest, res: Response) => {
49
+ filesystemManager.setReleaseChannel(req.stringBody ?? '');
50
+ res.sendStatus(204);
51
+ });
52
+
53
+ router.get('/show-pixel-grid', (req: Request, res: Response) => {
54
+ res.send(filesystemManager.getShowPixelGrid());
55
+ });
56
+
57
+ router.use('/show-pixel-grid', stringBody);
58
+
59
+ router.post('/show-pixel-grid', (req: StringBodyRequest, res: Response) => {
60
+ filesystemManager.setShowPixelGrid(req?.stringBody === 'true' ?? false);
61
+ res.sendStatus(204);
62
+ });
63
+
64
+ router.get('/snap-to-pixel-grid', (req: Request, res: Response) => {
65
+ res.send(filesystemManager.getSnapToPixelGrid());
66
+ });
67
+
68
+ router.use('/snap-to-pixel-grid', stringBody);
69
+
70
+ router.post('/snap-to-pixel-grid', (req: StringBodyRequest, res: Response) => {
71
+ filesystemManager.setSnapToPixelGrid(req?.stringBody === 'true' ?? false);
72
+ res.sendStatus(204);
73
+ });
74
+
75
+ router.use('/', (req: Request, res: Response, next: NextFunction) => {
76
+ if (!req.query.path) {
77
+ res.status(400).send({ error: 'Missing required query parameter "path"' });
78
+ return;
79
+ }
80
+ next();
81
+ });
82
+
83
+ router.get('/list', async (req: Request, res: Response) => {
84
+ let pathArg = req.query.path as string;
85
+
86
+ try {
87
+ res.send(await filesystemManager.readDirectory(pathArg));
88
+ } catch (err) {
89
+ res.status(400).send({ error: '' + err });
90
+ }
91
+ });
92
+
93
+ router.get('/readfile', async (req: Request, res: Response) => {
94
+ let pathArg = req.query.path as string;
95
+ try {
96
+ res.send(await filesystemManager.readFile(pathArg));
97
+ } catch (err) {
98
+ res.status(400).send({ error: '' + err });
99
+ }
100
+ });
101
+
102
+ router.put('/mkdir', async (req: Request, res: Response) => {
103
+ let pathArg = req.query.path as string;
104
+ try {
105
+ await filesystemManager.createFolder(pathArg);
106
+ res.sendStatus(204);
107
+ } catch (err) {
108
+ res.status(400).send({ error: '' + err });
109
+ }
110
+ });
111
+
112
+ router.use('/writefile', stringBody);
113
+ router.post('/writefile', async (req: StringBodyRequest, res: Response) => {
114
+ let pathArg = req.query.path as string;
115
+ try {
116
+ await filesystemManager.writeFile(pathArg, req.stringBody ?? '');
117
+ res.sendStatus(204);
118
+ } catch (err) {
119
+ res.status(400).send({ error: '' + err });
120
+ }
121
+ });
122
+
123
+ export default router;
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+
6
+ import Path from 'path';
7
+ import FS from 'fs';
8
+ import FSExtra from 'fs-extra';
9
+ import { storageService } from './storageService';
10
+
11
+ const SECTION_ID = 'filesystem';
12
+ const PROJECT_ROOT = 'project_root';
13
+ const EDITOR = 'editor';
14
+ const RELEASE_CHANNEL = 'release_channel';
15
+ const SHOW_PIXEL_GRID = 'show_pixel_grid';
16
+ const SNAP_TO_PIXEL_GRID = 'snap_to_pixel_grid';
17
+
18
+ function isFile(path: string) {
19
+ try {
20
+ return FS.statSync(path).isFile();
21
+ } catch (error) {
22
+ return false;
23
+ }
24
+ }
25
+
26
+ class FilesystemManager {
27
+ async writeFile(path: string, data: string | Buffer) {
28
+ const dirName = Path.dirname(path);
29
+ if (!FS.existsSync(dirName)) {
30
+ FSExtra.mkdirpSync(dirName, {});
31
+ }
32
+ FS.writeFileSync(path, data);
33
+ }
34
+
35
+ async createFolder(path: string): Promise<void> {
36
+ return new Promise((resolve, reject) => {
37
+ FS.mkdir(path, (err) => {
38
+ if (err) {
39
+ err.message += '. You can only create one single folder at a time.';
40
+ reject(err.message);
41
+ return;
42
+ }
43
+ resolve();
44
+ });
45
+ });
46
+ }
47
+
48
+ async readDirectory(path: string): Promise<{ path: string; folder: boolean }[]> {
49
+ return new Promise((resolve, reject) => {
50
+ let response: { path: string; folder: boolean }[] = [];
51
+ FS.readdir(path, (err: any, files: string[]) => {
52
+ if (err) {
53
+ reject(new Error(err));
54
+ return;
55
+ }
56
+ files.forEach((file) => {
57
+ response.push({
58
+ path: Path.join(path, file),
59
+ folder: FS.lstatSync(Path.join(path, file)).isDirectory(),
60
+ });
61
+ });
62
+ resolve(response);
63
+ });
64
+ });
65
+ }
66
+
67
+ async readFile(path: string): Promise<Buffer> {
68
+ return new Promise((resolve, reject) => {
69
+ if (!isFile(path)) {
70
+ reject(
71
+ new Error(
72
+ 'The path provided is invalid.Please check that the path and file name that were provided are spelled correctly. '
73
+ )
74
+ );
75
+ } else {
76
+ FS.readFile(path, (err, data) => {
77
+ if (err) {
78
+ reject(new Error(err.message));
79
+ return;
80
+ }
81
+ resolve(data);
82
+ });
83
+ }
84
+ });
85
+ }
86
+
87
+ getRootFolder(): string {
88
+ return require('os').homedir();
89
+ }
90
+
91
+ getProjectRootFolder(): string | undefined {
92
+ return storageService.get(SECTION_ID, PROJECT_ROOT);
93
+ }
94
+
95
+ setProjectRootFolder(folder: string) {
96
+ storageService.put(SECTION_ID, PROJECT_ROOT, folder);
97
+ }
98
+
99
+ getEditor(): string | undefined {
100
+ return storageService.get(SECTION_ID, EDITOR);
101
+ }
102
+
103
+ setEditor(editor: string) {
104
+ storageService.put(SECTION_ID, EDITOR, editor);
105
+ }
106
+
107
+ // Should we put this in its own manager service?
108
+ getReleaseChannel() {
109
+ return storageService.get<string>('app', RELEASE_CHANNEL);
110
+ }
111
+
112
+ setReleaseChannel(channel: string) {
113
+ storageService.put('app', RELEASE_CHANNEL, channel);
114
+ }
115
+
116
+ getShowPixelGrid() {
117
+ return storageService.get<boolean>('app', SHOW_PIXEL_GRID, true);
118
+ }
119
+
120
+ setShowPixelGrid(show: boolean) {
121
+ storageService.put('app', SHOW_PIXEL_GRID, show);
122
+ }
123
+
124
+ getSnapToPixelGrid() {
125
+ return storageService.get<boolean>('app', SNAP_TO_PIXEL_GRID, false);
126
+ }
127
+
128
+ setSnapToPixelGrid(snap: boolean) {
129
+ storageService.put('app', SNAP_TO_PIXEL_GRID, snap);
130
+ }
131
+ }
132
+
133
+ export const filesystemManager = new FilesystemManager();
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+
6
+ import Router from 'express-promise-router';
7
+ import { KapetaAPI } from '@kapeta/nodejs-api-client';
8
+
9
+ import { corsHandler } from '../middleware/cors';
10
+ import { Request, Response } from 'express';
11
+
12
+ const router = Router();
13
+
14
+ router.use('/', corsHandler);
15
+
16
+ router.get('/current', async (req: Request, res: Response) => {
17
+ const api = new KapetaAPI();
18
+ if (api.hasToken()) {
19
+ try {
20
+ res.json(await api.getCurrentIdentity());
21
+ return;
22
+ } catch (e) {
23
+ console.error(e);
24
+ }
25
+ }
26
+ res.status(200).json(null);
27
+ });
28
+
29
+ router.get('/:identityId/memberships', async (req: Request, res: Response) => {
30
+ const api = new KapetaAPI();
31
+ if (api.hasToken()) {
32
+ res.send(await api.getMemberships(req.params.identityId));
33
+ } else {
34
+ res.send([]);
35
+ }
36
+ });
37
+
38
+ export default router;