@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,239 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.transformToPlan = void 0;
7
+ const definitionsManager_1 = require("../definitionsManager");
8
+ const nodejs_utils_1 = require("@kapeta/nodejs-utils");
9
+ const node_uuid_1 = __importDefault(require("node-uuid"));
10
+ async function getFreeName(name) {
11
+ let currentName = name;
12
+ let iteration = 1;
13
+ do {
14
+ const found = await definitionsManager_1.definitionsManager.getLatestDefinition(currentName);
15
+ if (!found) {
16
+ return currentName;
17
+ }
18
+ currentName = name + '_' + iteration++;
19
+ } while (true);
20
+ }
21
+ const transformToPlan = async (handle, application) => {
22
+ const blockTypeService = await definitionsManager_1.definitionsManager.getLatestDefinition('kapeta/block-type-service');
23
+ const blockTypeFrontend = await definitionsManager_1.definitionsManager.getLatestDefinition('kapeta/block-type-frontend');
24
+ const mongoDbResource = await definitionsManager_1.definitionsManager.getLatestDefinition('kapeta/resource-type-mongodb');
25
+ const postgresResource = await definitionsManager_1.definitionsManager.getLatestDefinition('kapeta/resource-type-postgresql');
26
+ const webPageResource = await definitionsManager_1.definitionsManager.getLatestDefinition('kapeta/resource-type-web-page');
27
+ const webFragmentResource = await definitionsManager_1.definitionsManager.getLatestDefinition('kapeta/resource-type-web-fragment');
28
+ const restApiResource = await definitionsManager_1.definitionsManager.getLatestDefinition('kapeta/resource-type-rest-api');
29
+ const restClientResource = await definitionsManager_1.definitionsManager.getLatestDefinition('kapeta/resource-type-rest-client');
30
+ const javaLanguage = await definitionsManager_1.definitionsManager.getLatestDefinition('kapeta/language-target-java-spring-boot');
31
+ const nodejsLanguage = await definitionsManager_1.definitionsManager.getLatestDefinition('kapeta/language-target-nodejs');
32
+ const reactLanguage = await definitionsManager_1.definitionsManager.getLatestDefinition('kapeta/language-target-react-ts');
33
+ if (!blockTypeService ||
34
+ !blockTypeFrontend ||
35
+ !mongoDbResource ||
36
+ !postgresResource ||
37
+ !javaLanguage ||
38
+ !nodejsLanguage ||
39
+ !reactLanguage ||
40
+ !webPageResource ||
41
+ !restApiResource ||
42
+ !restClientResource ||
43
+ !webFragmentResource) {
44
+ throw new Error('Missing definitions');
45
+ }
46
+ const plan = {
47
+ kind: 'core/plan',
48
+ metadata: {
49
+ name: await getFreeName(`${handle}/${application.name}`),
50
+ title: application.title,
51
+ description: application.description,
52
+ visibility: 'private',
53
+ },
54
+ spec: {
55
+ blocks: [],
56
+ connections: [],
57
+ },
58
+ };
59
+ const blocks = [];
60
+ const addToPlan = (ref, name) => {
61
+ const top = 100 + Math.floor(plan.spec.blocks.length / 3) * 300;
62
+ const left = 200 + (plan.spec.blocks.length % 3) * 450;
63
+ plan.spec.blocks.push({
64
+ block: {
65
+ ref,
66
+ },
67
+ name,
68
+ id: node_uuid_1.default.v4(),
69
+ dimensions: {
70
+ top,
71
+ left,
72
+ width: -1,
73
+ height: -1,
74
+ },
75
+ });
76
+ };
77
+ const nameMapper = new Map();
78
+ for (const backend of application.backends) {
79
+ const blockName = `${handle}/${backend.name}`;
80
+ const blockRealName = await getFreeName(blockName);
81
+ nameMapper.set(blockName, blockRealName);
82
+ const language = backend.targetLanguage === 'java' ? javaLanguage : nodejsLanguage;
83
+ const databaseInfo = backend.databases?.[0];
84
+ const database = databaseInfo?.type === 'mongodb' ? mongoDbResource : postgresResource;
85
+ const blockRef = (0, nodejs_utils_1.normalizeKapetaUri)(blockRealName + ':local');
86
+ let targetOptions = {};
87
+ if (backend.targetLanguage === 'java') {
88
+ targetOptions = {
89
+ basePackage: `${handle}.${application.name}`.toLowerCase().replace(/-/g, '_'),
90
+ groupId: `${handle}.${application.name}`.toLowerCase().replace(/-/g, '_'),
91
+ artifactId: backend.name.toLowerCase().replace(/-/g, '_'),
92
+ };
93
+ }
94
+ blocks.push({
95
+ kind: (0, nodejs_utils_1.normalizeKapetaUri)(`${blockTypeService.definition.metadata.name}:${blockTypeService.version}`),
96
+ metadata: {
97
+ name: blockRealName,
98
+ title: backend.title,
99
+ description: backend.description,
100
+ visibility: 'private',
101
+ },
102
+ spec: {
103
+ target: {
104
+ kind: (0, nodejs_utils_1.normalizeKapetaUri)(`${language.definition.metadata.name}:${language.version}`),
105
+ options: targetOptions,
106
+ },
107
+ consumers: [
108
+ {
109
+ kind: (0, nodejs_utils_1.normalizeKapetaUri)(`${database.definition.metadata.name}:${database.version}`),
110
+ metadata: {
111
+ name: (databaseInfo?.name ?? 'main').replace(/-/g, ''),
112
+ },
113
+ spec: {
114
+ port: {
115
+ type: database.definition.spec.ports[0].type,
116
+ },
117
+ },
118
+ },
119
+ ],
120
+ providers: [
121
+ {
122
+ kind: (0, nodejs_utils_1.normalizeKapetaUri)(`${restApiResource.definition.metadata.name}:${restApiResource.version}`),
123
+ metadata: {
124
+ name: 'main',
125
+ },
126
+ spec: {
127
+ port: {
128
+ type: restApiResource.definition.spec.ports[0].type,
129
+ },
130
+ },
131
+ },
132
+ ],
133
+ },
134
+ });
135
+ addToPlan(blockRef, backend.name);
136
+ }
137
+ for (const frontend of application.frontends) {
138
+ const blockName = `${handle}/${frontend.name}`;
139
+ const blockRealName = await getFreeName(blockName);
140
+ nameMapper.set(blockName, blockRealName);
141
+ const language = reactLanguage;
142
+ const blockRef = (0, nodejs_utils_1.normalizeKapetaUri)(blockRealName + ':local');
143
+ blocks.push({
144
+ kind: (0, nodejs_utils_1.normalizeKapetaUri)(`${blockTypeFrontend.definition.metadata.name}:${blockTypeFrontend.version}`),
145
+ metadata: {
146
+ name: blockRealName,
147
+ title: frontend.title,
148
+ description: frontend.description,
149
+ visibility: 'private',
150
+ },
151
+ spec: {
152
+ target: {
153
+ kind: (0, nodejs_utils_1.normalizeKapetaUri)(`${language.definition.metadata.name}:${language.version}`),
154
+ options: {},
155
+ },
156
+ consumers: [],
157
+ providers: [
158
+ {
159
+ kind: (0, nodejs_utils_1.normalizeKapetaUri)(`${webPageResource.definition.metadata.name}:${webPageResource.version}`),
160
+ metadata: {
161
+ name: 'main',
162
+ },
163
+ spec: {
164
+ port: {
165
+ type: webPageResource.definition.spec.ports[0].type,
166
+ },
167
+ },
168
+ },
169
+ ],
170
+ },
171
+ });
172
+ addToPlan(blockRef, frontend.name);
173
+ }
174
+ application.connections?.forEach((connection) => {
175
+ const fullProviderName = nameMapper.get(`${handle}/${connection.provider.name}`);
176
+ const fullConsumerName = nameMapper.get(`${handle}/${connection.consumer.name}`);
177
+ const consumerResourceName = connection.provider.name;
178
+ const providerRef = (0, nodejs_utils_1.normalizeKapetaUri)(`${fullProviderName}:local`);
179
+ const consumerRef = (0, nodejs_utils_1.normalizeKapetaUri)(`${fullConsumerName}:local`);
180
+ const instanceProvider = plan.spec.blocks.find((b) => b.block.ref === providerRef);
181
+ const instanceConsumer = plan.spec.blocks.find((b) => b.block.ref === consumerRef);
182
+ const consumerBlock = blocks.find((block) => block.metadata.name === fullConsumerName);
183
+ const providerBlock = blocks.find((block) => block.metadata.name === fullProviderName);
184
+ if (!consumerBlock) {
185
+ throw new Error('Missing consumer block: ' + fullConsumerName);
186
+ }
187
+ if (!providerBlock) {
188
+ throw new Error('Missing provider block: ' + fullProviderName);
189
+ }
190
+ const portType = (0, nodejs_utils_1.parseKapetaUri)(providerBlock.kind).fullName === 'kapeta/block-type-service' ? 'rest' : 'web';
191
+ if (portType === 'rest') {
192
+ consumerBlock.spec.consumers.push({
193
+ kind: (0, nodejs_utils_1.normalizeKapetaUri)(`${restClientResource.definition.metadata.name}:${restClientResource.version}`),
194
+ metadata: {
195
+ name: consumerResourceName,
196
+ },
197
+ spec: {
198
+ port: {
199
+ type: 'rest',
200
+ },
201
+ },
202
+ });
203
+ }
204
+ else {
205
+ consumerBlock.spec.consumers.push({
206
+ kind: (0, nodejs_utils_1.normalizeKapetaUri)(`${webFragmentResource.definition.metadata.name}:${webFragmentResource.version}`),
207
+ metadata: {
208
+ name: consumerResourceName,
209
+ },
210
+ spec: {
211
+ port: {
212
+ type: 'web',
213
+ },
214
+ },
215
+ });
216
+ }
217
+ plan.spec.connections.push({
218
+ provider: {
219
+ blockId: instanceProvider.id,
220
+ resourceName: 'main',
221
+ port: {
222
+ type: portType,
223
+ },
224
+ },
225
+ consumer: {
226
+ blockId: instanceConsumer.id,
227
+ resourceName: consumerResourceName,
228
+ port: {
229
+ type: portType,
230
+ },
231
+ },
232
+ });
233
+ });
234
+ return {
235
+ plan,
236
+ blocks,
237
+ };
238
+ };
239
+ exports.transformToPlan = transformToPlan;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+ export interface Database {
6
+ name: string;
7
+ type: 'mongodb' | 'postgres';
8
+ }
9
+ export interface BackendService {
10
+ name: string;
11
+ title: string;
12
+ description: string;
13
+ targetLanguage: 'java' | 'node';
14
+ databases: Database[] | null;
15
+ }
16
+ export interface FrontendService {
17
+ name: string;
18
+ title: string;
19
+ description: string;
20
+ targetLanguage: 'react';
21
+ }
22
+ export interface Endpoint {
23
+ type: 'backend' | 'frontend';
24
+ name: string;
25
+ }
26
+ export interface Connection {
27
+ provider: Endpoint;
28
+ consumer: Endpoint;
29
+ }
30
+ export interface Application {
31
+ kind: 'core/plan';
32
+ name: string;
33
+ title: string;
34
+ description: string;
35
+ backends: BackendService[];
36
+ frontends: FrontendService[];
37
+ connections: Connection[];
38
+ explanation: string;
39
+ response: string;
40
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+ /// <reference types="express" />
6
+ declare const router: import("express").Router;
7
+ export default router;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright 2023 Kapeta Inc.
4
+ * SPDX-License-Identifier: BUSL-1.1
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ const express_promise_router_1 = __importDefault(require("express-promise-router"));
11
+ const cors_1 = require("./middleware/cors");
12
+ const nodejs_api_client_1 = require("@kapeta/nodejs-api-client");
13
+ const nodejs_registry_utils_1 = require("@kapeta/nodejs-registry-utils");
14
+ const { createAPIRoute } = require('@kapeta/web-microfrontend/server');
15
+ const packageJson = require('../package.json');
16
+ const router = (0, express_promise_router_1.default)();
17
+ router.use('/', cors_1.corsHandler);
18
+ router.use('/registry', createAPIRoute(nodejs_registry_utils_1.Config.data?.registry?.url ?? 'https://registry.kapeta.com', {
19
+ nonce: false,
20
+ userAgent: `KapetaDesktopCluster/${packageJson.version}`,
21
+ tokenFetcher: () => {
22
+ const api = new nodejs_api_client_1.KapetaAPI();
23
+ if (api.hasToken()) {
24
+ return api.getAccessToken();
25
+ }
26
+ return null;
27
+ },
28
+ }));
29
+ exports.default = router;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+ import { Definition } from '@kapeta/local-cluster-config';
6
+ import { BlockDefinition, BlockInstance, Plan } from '@kapeta/schemas';
7
+ import { Task } from './taskManager';
8
+ import { SourceOfChange } from './types';
9
+ export interface EnrichedAsset {
10
+ ref: string;
11
+ editable: boolean;
12
+ exists: boolean;
13
+ version: string;
14
+ kind: string;
15
+ data: Definition;
16
+ path: string;
17
+ ymlPath: string;
18
+ }
19
+ declare class AssetManager {
20
+ startUpgradeInterval(): void;
21
+ /**
22
+ *
23
+ * @param {string[]} [assetKinds]
24
+ * @returns {{path: *, ref: string, data: *, editable: boolean, kind: *, exists: boolean}[]}
25
+ */
26
+ getAssets(assetKinds?: string[]): Promise<EnrichedAsset[]>;
27
+ getPlans(): Promise<EnrichedAsset[]>;
28
+ getPlan(ref: string, noCache?: boolean): Promise<Plan>;
29
+ getBlockInstance(systemId: string, instanceId: string): Promise<BlockInstance>;
30
+ getAsset(ref: string, noCache?: boolean, autoFetch?: boolean): Promise<EnrichedAsset | undefined>;
31
+ createAsset(path: string, yaml: BlockDefinition, sourceOfChange?: SourceOfChange): Promise<EnrichedAsset[]>;
32
+ updateAsset(ref: string, yaml: Definition, sourceOfChange?: SourceOfChange): Promise<void>;
33
+ importFile(filePath: string): Promise<EnrichedAsset[]>;
34
+ unregisterAsset(ref: string): Promise<void>;
35
+ installAsset(ref: string, wait?: boolean): Promise<Task<void>[] | undefined>;
36
+ private cleanupUnusedProviders;
37
+ private upgradeAllProviders;
38
+ private maybeGenerateCode;
39
+ }
40
+ export declare const assetManager: AssetManager;
41
+ export {};
@@ -0,0 +1,274 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright 2023 Kapeta Inc.
4
+ * SPDX-License-Identifier: BUSL-1.1
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.assetManager = void 0;
11
+ const node_path_1 = __importDefault(require("node:path"));
12
+ const fs_extra_1 = __importDefault(require("fs-extra"));
13
+ const yaml_1 = __importDefault(require("yaml"));
14
+ const codeGeneratorManager_1 = require("./codeGeneratorManager");
15
+ const progressListener_1 = require("./progressListener");
16
+ const nodejs_utils_1 = require("@kapeta/nodejs-utils");
17
+ const repositoryManager_1 = require("./repositoryManager");
18
+ const nodejs_registry_utils_1 = require("@kapeta/nodejs-registry-utils");
19
+ const definitionsManager_1 = require("./definitionsManager");
20
+ const taskManager_1 = require("./taskManager");
21
+ const types_1 = require("./types");
22
+ const cacheManager_1 = require("./cacheManager");
23
+ const node_uuid_1 = __importDefault(require("node-uuid"));
24
+ const node_os_1 = __importDefault(require("node:os"));
25
+ const CACHE_TTL = 60 * 60 * 1000; // 1 hour
26
+ const UPGRADE_CHECK_INTERVAL = 10 * 60 * 1000; // 10 minutes
27
+ const toKey = (ref) => `assetManager:asset:${ref}`;
28
+ function filterExists(asset) {
29
+ return fs_extra_1.default.existsSync(asset.path) && fs_extra_1.default.existsSync(asset.ymlPath);
30
+ }
31
+ function enrichAsset(asset) {
32
+ return {
33
+ ref: `kapeta://${asset.definition.metadata.name}:${asset.version}`,
34
+ editable: asset.version === 'local', //Only local versions are editable
35
+ exists: true,
36
+ version: asset.version,
37
+ kind: asset.definition.kind,
38
+ data: asset.definition,
39
+ path: fs_extra_1.default.realpathSync(asset.path),
40
+ ymlPath: fs_extra_1.default.realpathSync(asset.ymlPath),
41
+ };
42
+ }
43
+ function compareRefs(a, b) {
44
+ const [aProtocol, aId] = parseRef(a);
45
+ const [bProtocol, bId] = parseRef(b);
46
+ return aProtocol === bProtocol && aId === bId;
47
+ }
48
+ function parseRef(ref) {
49
+ let out = ref.split(/:\/\//, 2);
50
+ if (out.length === 1) {
51
+ return ['kapeta', ref.toLowerCase()];
52
+ }
53
+ return [out[0].toLowerCase(), out[1].toLowerCase()];
54
+ }
55
+ class AssetManager {
56
+ startUpgradeInterval() {
57
+ console.debug('Checking for upgrades...');
58
+ this.upgradeAllProviders()
59
+ .then((task) => {
60
+ return task && task.wait();
61
+ })
62
+ .catch((e) => {
63
+ console.error('Failed to upgrade providers', e);
64
+ })
65
+ .finally(() => {
66
+ setTimeout(() => {
67
+ this.startUpgradeInterval();
68
+ }, UPGRADE_CHECK_INTERVAL);
69
+ });
70
+ }
71
+ /**
72
+ *
73
+ * @param {string[]} [assetKinds]
74
+ * @returns {{path: *, ref: string, data: *, editable: boolean, kind: *, exists: boolean}[]}
75
+ */
76
+ async getAssets(assetKinds) {
77
+ if (!assetKinds) {
78
+ const blockTypeProviders = await definitionsManager_1.definitionsManager.getDefinitions([
79
+ types_1.KIND_BLOCK_TYPE,
80
+ types_1.KIND_BLOCK_TYPE_OPERATOR,
81
+ types_1.KIND_BLOCK_TYPE_EXECUTABLE,
82
+ ]);
83
+ assetKinds = blockTypeProviders.map((p) => {
84
+ return `${p.definition.metadata.name}:${p.version}`;
85
+ });
86
+ assetKinds.push('core/plan');
87
+ }
88
+ const assets = await definitionsManager_1.definitionsManager.getDefinitions(assetKinds);
89
+ return assets.filter(filterExists).map(enrichAsset);
90
+ }
91
+ async getPlans() {
92
+ return this.getAssets(['core/plan']);
93
+ }
94
+ async getPlan(ref, noCache = false) {
95
+ const asset = await this.getAsset(ref, noCache);
96
+ if (!asset) {
97
+ throw new Error('Plan was not found: ' + ref);
98
+ }
99
+ if ('core/plan' !== asset?.kind) {
100
+ throw new Error('Asset was not a plan: ' + ref);
101
+ }
102
+ return asset.data;
103
+ }
104
+ async getBlockInstance(systemId, instanceId) {
105
+ const plan = await this.getPlan(systemId, true);
106
+ const instance = plan.spec.blocks?.find((instance) => instance.id === instanceId);
107
+ if (!instance) {
108
+ throw new Error(`Instance not found: ${instanceId} in plan ${systemId}`);
109
+ }
110
+ return instance;
111
+ }
112
+ async getAsset(ref, noCache = false, autoFetch = true) {
113
+ ref = (0, nodejs_utils_1.normalizeKapetaUri)(ref);
114
+ const cacheKey = toKey(ref);
115
+ if (!noCache && cacheManager_1.cacheManager.has(cacheKey)) {
116
+ return cacheManager_1.cacheManager.get(cacheKey);
117
+ }
118
+ const uri = (0, nodejs_utils_1.parseKapetaUri)(ref);
119
+ if (autoFetch) {
120
+ await repositoryManager_1.repositoryManager.ensureAsset(uri.handle, uri.name, uri.version, true);
121
+ }
122
+ const definitionInfo = await definitionsManager_1.definitionsManager.getDefinition(ref);
123
+ if (autoFetch && !definitionInfo) {
124
+ throw new Error('Asset not found: ' + ref);
125
+ }
126
+ if (definitionInfo) {
127
+ const asset = enrichAsset(definitionInfo);
128
+ cacheManager_1.cacheManager.set(cacheKey, asset, CACHE_TTL);
129
+ return asset;
130
+ }
131
+ return undefined;
132
+ }
133
+ async createAsset(path, yaml, sourceOfChange = 'filesystem') {
134
+ if (await fs_extra_1.default.pathExists(path)) {
135
+ throw new Error('File already exists: ' + path);
136
+ }
137
+ const dirName = node_path_1.default.dirname(path);
138
+ if (!(await fs_extra_1.default.pathExists(dirName))) {
139
+ await fs_extra_1.default.mkdirp(dirName);
140
+ }
141
+ await repositoryManager_1.repositoryManager.setSourceOfChangeFor(path, sourceOfChange);
142
+ await fs_extra_1.default.writeFile(path, yaml_1.default.stringify(yaml));
143
+ const asset = await this.importFile(path);
144
+ asset.forEach((a) => {
145
+ const ref = (0, nodejs_utils_1.normalizeKapetaUri)(a.ref);
146
+ const key = toKey(ref);
147
+ cacheManager_1.cacheManager.set(key, a, CACHE_TTL);
148
+ });
149
+ definitionsManager_1.definitionsManager.clearCache();
150
+ console.log(`Created asset at: ${path}`);
151
+ const ref = `kapeta://${yaml.metadata.name}:local`;
152
+ await this.maybeGenerateCode(ref, path, yaml);
153
+ return asset;
154
+ }
155
+ async updateAsset(ref, yaml, sourceOfChange = 'filesystem') {
156
+ ref = (0, nodejs_utils_1.normalizeKapetaUri)(ref);
157
+ const asset = await this.getAsset(ref, true, false);
158
+ if (!asset) {
159
+ throw new Error('Attempted to update unknown asset: ' + ref);
160
+ }
161
+ if (!asset.editable) {
162
+ throw new Error('Attempted to update read-only asset: ' + ref);
163
+ }
164
+ if (!asset.ymlPath) {
165
+ throw new Error('Attempted to update corrupted asset: ' + ref);
166
+ }
167
+ await repositoryManager_1.repositoryManager.setSourceOfChangeFor(asset.ymlPath, sourceOfChange);
168
+ await fs_extra_1.default.writeFile(asset.ymlPath, yaml_1.default.stringify(yaml));
169
+ console.log(`Updated asset at: ${asset.ymlPath}`);
170
+ cacheManager_1.cacheManager.remove(toKey(ref));
171
+ definitionsManager_1.definitionsManager.clearCache();
172
+ await this.maybeGenerateCode(asset.ref, asset.ymlPath, yaml);
173
+ }
174
+ async importFile(filePath) {
175
+ if (filePath.startsWith('file://')) {
176
+ filePath = filePath.substring('file://'.length);
177
+ }
178
+ if (!(await fs_extra_1.default.pathExists(filePath))) {
179
+ throw new Error('File not found: ' + filePath);
180
+ }
181
+ const content = await fs_extra_1.default.readFile(filePath);
182
+ const assetInfos = yaml_1.default.parseAllDocuments(content.toString()).map((doc) => doc.toJSON());
183
+ await nodejs_registry_utils_1.Actions.link(new progressListener_1.ProgressListener(), node_path_1.default.dirname(filePath));
184
+ const version = 'local';
185
+ const refs = assetInfos.map((assetInfo) => (0, nodejs_utils_1.normalizeKapetaUri)(`kapeta://${assetInfo.metadata.name}:${version}`));
186
+ refs.forEach((ref) => {
187
+ const key = toKey(ref);
188
+ cacheManager_1.cacheManager.remove(key);
189
+ });
190
+ definitionsManager_1.definitionsManager.clearCache();
191
+ // Get all possible asset kinds, to make sure we return the result if possible
192
+ const assets = await this.getAssets([]);
193
+ return assets.filter((a) => refs.some((ref) => compareRefs(ref, a.ref)));
194
+ }
195
+ async unregisterAsset(ref) {
196
+ const asset = await this.getAsset(ref, true, false);
197
+ if (!asset) {
198
+ throw new Error('Asset does not exists: ' + ref);
199
+ }
200
+ const key = toKey(ref);
201
+ cacheManager_1.cacheManager.remove(key);
202
+ definitionsManager_1.definitionsManager.clearCache();
203
+ await nodejs_registry_utils_1.Actions.uninstall(new progressListener_1.ProgressListener(), [asset.ref]);
204
+ }
205
+ async installAsset(ref, wait = false) {
206
+ const asset = await this.getAsset(ref, true, false);
207
+ if (asset) {
208
+ throw new Error('Asset already installed: ' + ref);
209
+ }
210
+ const uri = (0, nodejs_utils_1.parseKapetaUri)(ref);
211
+ console.log('Installing %s (sync: %s)', ref, wait);
212
+ const key = toKey(ref);
213
+ cacheManager_1.cacheManager.remove(key);
214
+ definitionsManager_1.definitionsManager.clearCache();
215
+ return await repositoryManager_1.repositoryManager.ensureAsset(uri.handle, uri.name, uri.version, wait);
216
+ }
217
+ async cleanupUnusedProviders() {
218
+ const unusedProviders = await repositoryManager_1.repositoryManager.getUnusedProviders();
219
+ if (unusedProviders.length < 1) {
220
+ return;
221
+ }
222
+ console.log('Cleaning up unused providers: ', unusedProviders);
223
+ await Promise.all(unusedProviders.map((ref) => {
224
+ return this.unregisterAsset(ref);
225
+ }));
226
+ }
227
+ async upgradeAllProviders() {
228
+ const providers = await definitionsManager_1.definitionsManager.getProviderDefinitions();
229
+ const names = providers.map((p) => p.definition.metadata.name);
230
+ const refs = await repositoryManager_1.repositoryManager.getUpdatableAssets(names);
231
+ if (refs.length < 1) {
232
+ await this.cleanupUnusedProviders();
233
+ return;
234
+ }
235
+ console.log('Installing updates', refs);
236
+ const updateAll = async (task) => {
237
+ const progressListener = new progressListener_1.TaskProgressListener(task);
238
+ try {
239
+ //We change to a temp dir to avoid issues with the current working directory
240
+ process.chdir(node_os_1.default.tmpdir());
241
+ await nodejs_registry_utils_1.Actions.install(progressListener, refs, {});
242
+ await this.cleanupUnusedProviders();
243
+ }
244
+ catch (e) {
245
+ console.error(`Failed to update assets: ${refs.join(',')}`, e);
246
+ throw e;
247
+ }
248
+ cacheManager_1.cacheManager.flush();
249
+ definitionsManager_1.definitionsManager.clearCache();
250
+ };
251
+ return taskManager_1.taskManager.add(`asset:update`, updateAll, {
252
+ name: `Installing ${refs.length} updates`,
253
+ group: 'asset:update:check',
254
+ });
255
+ }
256
+ async maybeGenerateCode(ref, ymlPath, block) {
257
+ ref = (0, nodejs_utils_1.normalizeKapetaUri)(ref);
258
+ if (await codeGeneratorManager_1.codeGeneratorManager.canGenerateCode(block)) {
259
+ const assetTitle = block.metadata.title ? block.metadata.title : (0, nodejs_utils_1.parseKapetaUri)(block.metadata.name).name;
260
+ const taskId = `codegen:${node_uuid_1.default.v4()}`;
261
+ const group = `codegen:${ref}`;
262
+ // We group the codegen tasks since we want to run them all but only 1 at a time per block
263
+ taskManager_1.taskManager.add(taskId, async () => {
264
+ await codeGeneratorManager_1.codeGeneratorManager.generate(ymlPath, block);
265
+ }, {
266
+ name: `Generating code for ${assetTitle}`,
267
+ group, //Group prevents multiple tasks from running at the same time
268
+ });
269
+ return true;
270
+ }
271
+ return false;
272
+ }
273
+ }
274
+ exports.assetManager = new AssetManager();
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+ /// <reference types="express" />
6
+ declare const router: import("express").Router;
7
+ export default router;