@k-4u/resource-mapper-core 0.0.1

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 (250) hide show
  1. package/.aws-icons-last-updated +1 -0
  2. package/.svelte-kit/ambient.d.ts +263 -0
  3. package/.svelte-kit/generated/client/app.js +31 -0
  4. package/.svelte-kit/generated/client/matchers.js +1 -0
  5. package/.svelte-kit/generated/client/nodes/0.js +1 -0
  6. package/.svelte-kit/generated/client/nodes/1.js +1 -0
  7. package/.svelte-kit/generated/client/nodes/2.js +3 -0
  8. package/.svelte-kit/generated/client/nodes/3.js +3 -0
  9. package/.svelte-kit/generated/client-optimized/app.js +31 -0
  10. package/.svelte-kit/generated/client-optimized/matchers.js +1 -0
  11. package/.svelte-kit/generated/client-optimized/nodes/0.js +1 -0
  12. package/.svelte-kit/generated/client-optimized/nodes/1.js +1 -0
  13. package/.svelte-kit/generated/client-optimized/nodes/2.js +3 -0
  14. package/.svelte-kit/generated/client-optimized/nodes/3.js +3 -0
  15. package/.svelte-kit/generated/root.js +3 -0
  16. package/.svelte-kit/generated/root.svelte +68 -0
  17. package/.svelte-kit/generated/server/internal.js +53 -0
  18. package/.svelte-kit/non-ambient.d.ts +43 -0
  19. package/.svelte-kit/output/client/.vite/manifest.json +175 -0
  20. package/.svelte-kit/output/client/_app/immutable/assets/0.Czt_67iE.css +1 -0
  21. package/.svelte-kit/output/client/_app/immutable/assets/TeamContactCard.Dxj5nUCr.css +1 -0
  22. package/.svelte-kit/output/client/_app/immutable/assets/helpers.ysDrpaDf.css +1 -0
  23. package/.svelte-kit/output/client/_app/immutable/assets/libavoid.DQJapW5w.wasm +0 -0
  24. package/.svelte-kit/output/client/_app/immutable/chunks/BlLuv0eP.js +46 -0
  25. package/.svelte-kit/output/client/_app/immutable/chunks/CSBHmwYv.js +1 -0
  26. package/.svelte-kit/output/client/_app/immutable/chunks/CTCi5ueQ.js +1 -0
  27. package/.svelte-kit/output/client/_app/immutable/chunks/CfOzjaik.js +2 -0
  28. package/.svelte-kit/output/client/_app/immutable/chunks/D4PdvFNs.js +1 -0
  29. package/.svelte-kit/output/client/_app/immutable/chunks/DXgP-QUS.js +2 -0
  30. package/.svelte-kit/output/client/_app/immutable/chunks/DlbDC5An.js +1 -0
  31. package/.svelte-kit/output/client/_app/immutable/chunks/wRWe7aK9.js +1 -0
  32. package/.svelte-kit/output/client/_app/immutable/entry/app.ConrMuHl.js +2 -0
  33. package/.svelte-kit/output/client/_app/immutable/entry/start.Bm6FyGme.js +1 -0
  34. package/.svelte-kit/output/client/_app/immutable/nodes/0.d3cL-ETU.js +1 -0
  35. package/.svelte-kit/output/client/_app/immutable/nodes/1.D6z9rPGv.js +1 -0
  36. package/.svelte-kit/output/client/_app/immutable/nodes/2.CLD-8chl.js +1 -0
  37. package/.svelte-kit/output/client/_app/immutable/nodes/3.DXYeBoel.js +1 -0
  38. package/.svelte-kit/output/client/_app/version.json +1 -0
  39. package/.svelte-kit/output/client/libavoid.wasm +0 -0
  40. package/.svelte-kit/output/client/static/robots.txt +3 -0
  41. package/.svelte-kit/output/prerendered/dependencies/_app/env.js +1 -0
  42. package/.svelte-kit/output/server/.vite/manifest.json +224 -0
  43. package/.svelte-kit/output/server/_app/immutable/assets/LoadingOverlay.DBbe6V8W.css +1 -0
  44. package/.svelte-kit/output/server/_app/immutable/assets/_layout.Czt_67iE.css +1 -0
  45. package/.svelte-kit/output/server/_app/immutable/assets/_page.D9P41uDZ.css +1 -0
  46. package/.svelte-kit/output/server/chunks/ErrorDisplay.js +59 -0
  47. package/.svelte-kit/output/server/chunks/LoadingOverlay.js +12 -0
  48. package/.svelte-kit/output/server/chunks/LoadingOverlay.svelte_svelte_type_style_lang.js +1671 -0
  49. package/.svelte-kit/output/server/chunks/connections.js +33 -0
  50. package/.svelte-kit/output/server/chunks/diagram.js +7 -0
  51. package/.svelte-kit/output/server/chunks/environment.js +34 -0
  52. package/.svelte-kit/output/server/chunks/equality.js +57 -0
  53. package/.svelte-kit/output/server/chunks/exports.js +174 -0
  54. package/.svelte-kit/output/server/chunks/false.js +4 -0
  55. package/.svelte-kit/output/server/chunks/index.js +59 -0
  56. package/.svelte-kit/output/server/chunks/index2.js +2939 -0
  57. package/.svelte-kit/output/server/chunks/index3.js +20 -0
  58. package/.svelte-kit/output/server/chunks/internal.js +1017 -0
  59. package/.svelte-kit/output/server/chunks/shared.js +770 -0
  60. package/.svelte-kit/output/server/chunks/utils.js +43 -0
  61. package/.svelte-kit/output/server/entries/pages/_error.svelte.js +64 -0
  62. package/.svelte-kit/output/server/entries/pages/_layout.svelte.js +65 -0
  63. package/.svelte-kit/output/server/entries/pages/_page.svelte.js +3991 -0
  64. package/.svelte-kit/output/server/entries/pages/_page.ts.js +30 -0
  65. package/.svelte-kit/output/server/entries/pages/group/_groupId_/_page.svelte.js +67 -0
  66. package/.svelte-kit/output/server/entries/pages/group/_groupId_/_page.ts.js +47 -0
  67. package/.svelte-kit/output/server/index.js +3747 -0
  68. package/.svelte-kit/output/server/internal.js +13 -0
  69. package/.svelte-kit/output/server/manifest-full.js +47 -0
  70. package/.svelte-kit/output/server/manifest.js +47 -0
  71. package/.svelte-kit/output/server/nodes/0.js +8 -0
  72. package/.svelte-kit/output/server/nodes/1.js +8 -0
  73. package/.svelte-kit/output/server/nodes/2.js +10 -0
  74. package/.svelte-kit/output/server/nodes/3.js +10 -0
  75. package/.svelte-kit/output/server/remote-entry.js +557 -0
  76. package/.svelte-kit/tsconfig.json +61 -0
  77. package/.svelte-kit/types/route_meta_data.json +8 -0
  78. package/.svelte-kit/types/src/routes/$types.d.ts +26 -0
  79. package/.svelte-kit/types/src/routes/group/[groupId]/$types.d.ts +21 -0
  80. package/.svelte-kit/types/src/routes/group/[groupId]/proxy+page.ts +49 -0
  81. package/.svelte-kit/types/src/routes/proxy+page.ts +33 -0
  82. package/build/_app/env.js +1 -0
  83. package/build/_app/env.js.br +1 -0
  84. package/build/_app/env.js.gz +0 -0
  85. package/build/_app/immutable/assets/0.Czt_67iE.css +1 -0
  86. package/build/_app/immutable/assets/0.Czt_67iE.css.br +0 -0
  87. package/build/_app/immutable/assets/0.Czt_67iE.css.gz +0 -0
  88. package/build/_app/immutable/assets/TeamContactCard.Dxj5nUCr.css +1 -0
  89. package/build/_app/immutable/assets/TeamContactCard.Dxj5nUCr.css.br +0 -0
  90. package/build/_app/immutable/assets/TeamContactCard.Dxj5nUCr.css.gz +0 -0
  91. package/build/_app/immutable/assets/helpers.ysDrpaDf.css +1 -0
  92. package/build/_app/immutable/assets/helpers.ysDrpaDf.css.br +0 -0
  93. package/build/_app/immutable/assets/helpers.ysDrpaDf.css.gz +0 -0
  94. package/build/_app/immutable/assets/libavoid.DQJapW5w.wasm +0 -0
  95. package/build/_app/immutable/assets/libavoid.DQJapW5w.wasm.br +0 -0
  96. package/build/_app/immutable/assets/libavoid.DQJapW5w.wasm.gz +0 -0
  97. package/build/_app/immutable/chunks/BlLuv0eP.js +46 -0
  98. package/build/_app/immutable/chunks/BlLuv0eP.js.br +0 -0
  99. package/build/_app/immutable/chunks/BlLuv0eP.js.gz +0 -0
  100. package/build/_app/immutable/chunks/CSBHmwYv.js +1 -0
  101. package/build/_app/immutable/chunks/CSBHmwYv.js.br +0 -0
  102. package/build/_app/immutable/chunks/CSBHmwYv.js.gz +0 -0
  103. package/build/_app/immutable/chunks/CTCi5ueQ.js +1 -0
  104. package/build/_app/immutable/chunks/CTCi5ueQ.js.br +0 -0
  105. package/build/_app/immutable/chunks/CTCi5ueQ.js.gz +0 -0
  106. package/build/_app/immutable/chunks/CfOzjaik.js +2 -0
  107. package/build/_app/immutable/chunks/CfOzjaik.js.br +0 -0
  108. package/build/_app/immutable/chunks/CfOzjaik.js.gz +0 -0
  109. package/build/_app/immutable/chunks/D4PdvFNs.js +1 -0
  110. package/build/_app/immutable/chunks/D4PdvFNs.js.br +0 -0
  111. package/build/_app/immutable/chunks/D4PdvFNs.js.gz +0 -0
  112. package/build/_app/immutable/chunks/DXgP-QUS.js +2 -0
  113. package/build/_app/immutable/chunks/DXgP-QUS.js.br +0 -0
  114. package/build/_app/immutable/chunks/DXgP-QUS.js.gz +0 -0
  115. package/build/_app/immutable/chunks/DlbDC5An.js +1 -0
  116. package/build/_app/immutable/chunks/DlbDC5An.js.br +0 -0
  117. package/build/_app/immutable/chunks/DlbDC5An.js.gz +0 -0
  118. package/build/_app/immutable/chunks/wRWe7aK9.js +1 -0
  119. package/build/_app/immutable/chunks/wRWe7aK9.js.br +0 -0
  120. package/build/_app/immutable/chunks/wRWe7aK9.js.gz +0 -0
  121. package/build/_app/immutable/entry/app.ConrMuHl.js +2 -0
  122. package/build/_app/immutable/entry/app.ConrMuHl.js.br +0 -0
  123. package/build/_app/immutable/entry/app.ConrMuHl.js.gz +0 -0
  124. package/build/_app/immutable/entry/start.Bm6FyGme.js +1 -0
  125. package/build/_app/immutable/entry/start.Bm6FyGme.js.br +2 -0
  126. package/build/_app/immutable/entry/start.Bm6FyGme.js.gz +0 -0
  127. package/build/_app/immutable/nodes/0.d3cL-ETU.js +1 -0
  128. package/build/_app/immutable/nodes/0.d3cL-ETU.js.br +0 -0
  129. package/build/_app/immutable/nodes/0.d3cL-ETU.js.gz +0 -0
  130. package/build/_app/immutable/nodes/1.D6z9rPGv.js +1 -0
  131. package/build/_app/immutable/nodes/1.D6z9rPGv.js.br +0 -0
  132. package/build/_app/immutable/nodes/1.D6z9rPGv.js.gz +0 -0
  133. package/build/_app/immutable/nodes/2.CLD-8chl.js +1 -0
  134. package/build/_app/immutable/nodes/2.CLD-8chl.js.br +0 -0
  135. package/build/_app/immutable/nodes/2.CLD-8chl.js.gz +0 -0
  136. package/build/_app/immutable/nodes/3.DXYeBoel.js +1 -0
  137. package/build/_app/immutable/nodes/3.DXYeBoel.js.br +0 -0
  138. package/build/_app/immutable/nodes/3.DXYeBoel.js.gz +0 -0
  139. package/build/_app/version.json +1 -0
  140. package/build/_app/version.json.br +0 -0
  141. package/build/_app/version.json.gz +0 -0
  142. package/build/index.html +34 -0
  143. package/build/index.html.br +0 -0
  144. package/build/index.html.gz +0 -0
  145. package/build/libavoid.wasm +0 -0
  146. package/build/libavoid.wasm.br +0 -0
  147. package/build/libavoid.wasm.gz +0 -0
  148. package/build/static/robots.txt +3 -0
  149. package/coverage/coverage-final.json +6 -0
  150. package/coverage/coverage-summary.json +7 -0
  151. package/coverage/junit.xml +57 -0
  152. package/coverage/lcov-report/base.css +224 -0
  153. package/coverage/lcov-report/block-navigation.js +87 -0
  154. package/coverage/lcov-report/favicon.png +0 -0
  155. package/coverage/lcov-report/index.html +131 -0
  156. package/coverage/lcov-report/prettify.css +1 -0
  157. package/coverage/lcov-report/prettify.js +2 -0
  158. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  159. package/coverage/lcov-report/sorter.js +210 -0
  160. package/coverage/lcov-report/stores/index.html +116 -0
  161. package/coverage/lcov-report/stores/routingStore.ts.html +781 -0
  162. package/coverage/lcov-report/utils/flow/helpers.ts.html +127 -0
  163. package/coverage/lcov-report/utils/flow/index.html +161 -0
  164. package/coverage/lcov-report/utils/flow/layout.ts.html +805 -0
  165. package/coverage/lcov-report/utils/flow/serviceIds.ts.html +97 -0
  166. package/coverage/lcov-report/utils/flow/servicesGraph.ts.html +859 -0
  167. package/coverage/lcov.info +646 -0
  168. package/coverage/test-results.json +1 -0
  169. package/data/services/api/api-gateway.yaml +18 -0
  170. package/data/services/api/group-info.yaml +7 -0
  171. package/data/services/api/lambda-orders.yaml +21 -0
  172. package/data/services/api/lambda-products.yaml +15 -0
  173. package/data/services/api/lambda-users.yaml +15 -0
  174. package/data/services/compute/alb.yaml +15 -0
  175. package/data/services/compute/ecs-inventory.yaml +16 -0
  176. package/data/services/compute/ecs-notification.yaml +15 -0
  177. package/data/services/compute/group-info.yaml +7 -0
  178. package/data/services/data/dynamodb-notifications.yaml +12 -0
  179. package/data/services/data/dynamodb-orders.yaml +9 -0
  180. package/data/services/data/dynamodb-products.yaml +9 -0
  181. package/data/services/data/dynamodb-users.yaml +9 -0
  182. package/data/services/data/group-info.yaml +7 -0
  183. package/data/services/data/rds-postgres.yaml +9 -0
  184. package/data/services/data/redis.yaml +10 -0
  185. package/data/services/frontend/cloudfront.yaml +12 -0
  186. package/data/services/frontend/group-info.yaml +7 -0
  187. package/data/services/frontend/route53.yaml +15 -0
  188. package/data/services/frontend/s3-website.yaml +9 -0
  189. package/data/teams/cloud-shepherds.yaml +15 -0
  190. package/data/teams/data-wizards.yaml +15 -0
  191. package/data/teams/interface-architects.yaml +19 -0
  192. package/e2e/demo.test.ts +54 -0
  193. package/e2e/header-toolbar.simple.spec.ts +0 -0
  194. package/e2e/header-toolbar.spec.ts +53 -0
  195. package/e2e/layout.spec.ts +30 -0
  196. package/package.json +69 -0
  197. package/playwright.config.ts +10 -0
  198. package/plugins/mapper-data-plugin.ts +32 -0
  199. package/project.json +23 -0
  200. package/src/app.css +125 -0
  201. package/src/app.d.ts +31 -0
  202. package/src/app.html +11 -0
  203. package/src/lib/assets/favicon.svg +19 -0
  204. package/src/lib/components/EmptyState.svelte +37 -0
  205. package/src/lib/components/ErrorDisplay.svelte +82 -0
  206. package/src/lib/components/FlowCanvas.svelte +223 -0
  207. package/src/lib/components/GenericSidebarCard.svelte +44 -0
  208. package/src/lib/components/GroupDetailSidebar.svelte +31 -0
  209. package/src/lib/components/Header.svelte +57 -0
  210. package/src/lib/components/Legend.svelte +25 -0
  211. package/src/lib/components/LoadingOverlay.svelte +42 -0
  212. package/src/lib/components/LoadingSpinner.svelte +10 -0
  213. package/src/lib/components/ServiceDetailSidebar.svelte +90 -0
  214. package/src/lib/components/TeamContactCard.svelte +166 -0
  215. package/src/lib/components/flow/ExternalNode.svelte +45 -0
  216. package/src/lib/components/flow/MainGroupNode.svelte +24 -0
  217. package/src/lib/components/flow/ServiceGroupNode.svelte +17 -0
  218. package/src/lib/components/flow/ServiceNode.svelte +40 -0
  219. package/src/lib/components/flow/SnakeEdge.svelte +206 -0
  220. package/src/lib/components/flow/index.ts +6 -0
  221. package/src/lib/components/index.ts +12 -0
  222. package/src/lib/data/connections.ts +26 -0
  223. package/src/lib/data/groups.ts +11 -0
  224. package/src/lib/data/services.ts +12 -0
  225. package/src/lib/data/teams.ts +11 -0
  226. package/src/lib/index.ts +1 -0
  227. package/src/lib/state/theme.svelte.ts +21 -0
  228. package/src/lib/stores/diagram.ts +6 -0
  229. package/src/lib/stores/routingStore.test.ts +133 -0
  230. package/src/lib/stores/routingStore.ts +232 -0
  231. package/src/lib/utils/awsIcons.ts +117 -0
  232. package/src/lib/utils/flow/groupOverviewGraph.ts +73 -0
  233. package/src/lib/utils/flow/helpers.ts +14 -0
  234. package/src/lib/utils/flow/layout.test.ts +271 -0
  235. package/src/lib/utils/flow/layout.ts +240 -0
  236. package/src/lib/utils/flow/serviceIds.ts +5 -0
  237. package/src/lib/utils/flow/servicesGraph.test.ts +119 -0
  238. package/src/lib/utils/flow/servicesGraph.ts +258 -0
  239. package/src/routes/+error.svelte +36 -0
  240. package/src/routes/+layout.svelte +27 -0
  241. package/src/routes/+page.svelte +81 -0
  242. package/src/routes/+page.ts +31 -0
  243. package/src/routes/group/[groupId]/+page.svelte +102 -0
  244. package/src/routes/group/[groupId]/+page.ts +48 -0
  245. package/src/routes/layout.css +0 -0
  246. package/static/static/robots.txt +3 -0
  247. package/svelte.config.js +28 -0
  248. package/tailwind.config.js +12 -0
  249. package/tsconfig.json +22 -0
  250. package/vite.config.ts +81 -0
@@ -0,0 +1,15 @@
1
+ friendlyName: "User Management Lambda"
2
+ description: |
3
+ Lambda function handling user authentication, registration, and profile management.
4
+
5
+ Processes user-related API requests with JWT token validation and session management.
6
+ Connects to DynamoDB for user data storage and RDS for transactional operations.
7
+ serviceType: LAMBDA
8
+ outgoingConnections:
9
+ - targetIdentifier: "data/dynamodb-users"
10
+ description: "User data storage"
11
+ connectionType: CALLS
12
+ - targetIdentifier: "data/rds-postgres"
13
+ description: "User authentication data"
14
+ connectionType: TCP
15
+
@@ -0,0 +1,15 @@
1
+ friendlyName: "Application Load Balancer"
2
+ description: |
3
+ Application Load Balancer distributing traffic to ECS services across availability zones.
4
+
5
+ Provides health checks, SSL termination, and intelligent routing with path-based rules.
6
+ Configured with auto-scaling and connection draining for zero-downtime deployments.
7
+ serviceType: ALB
8
+ outgoingConnections:
9
+ - targetIdentifier: "compute/ecs-inventory"
10
+ description: "Routes to inventory service"
11
+ connectionType: TCP
12
+ - targetIdentifier: "compute/ecs-notification"
13
+ description: "Routes to notification service"
14
+ connectionType: TCP
15
+
@@ -0,0 +1,16 @@
1
+ friendlyName: "ECS Inventory Service"
2
+ description: |
3
+ Containerized Spring Boot inventory management service running on ECS Fargate.
4
+
5
+ REST API service handling real-time inventory tracking, stock updates, and warehouse management.
6
+ Built with Spring Boot, provides endpoints for inventory CRUD operations, stock level monitoring,
7
+ and automated reorder alerts. Auto-scales based on CPU and memory metrics.
8
+ serviceType: ECS
9
+ outgoingConnections:
10
+ - targetIdentifier: "data/rds-postgres"
11
+ description: "PostgreSQL database for inventory persistence"
12
+ connectionType: TCP
13
+ - targetIdentifier: "data/redis"
14
+ description: "Redis cache for high-frequency inventory lookups"
15
+ connectionType: TCP
16
+
@@ -0,0 +1,15 @@
1
+ friendlyName: "ECS Notification Service"
2
+ description: |
3
+ Containerized notification service running on ECS for email and SMS delivery.
4
+
5
+ Processes notification queues and sends alerts to users via multiple channels.
6
+ Integrates with external services and maintains delivery logs in DynamoDB.
7
+ serviceType: ECS
8
+ outgoingConnections:
9
+ - targetIdentifier: "data/dynamodb-notifications"
10
+ description: "Notification logs and queue"
11
+ connectionType: CALLS
12
+ - targetIdentifier: "data/redis"
13
+ description: "Redis cache for high-frequency inventory lookups"
14
+ connectionType: TCP
15
+
@@ -0,0 +1,7 @@
1
+ name: "Compute Services"
2
+ description: |
3
+ Manages containerized applications, load balancers, and compute resources.
4
+ This group handles ECS clusters, container services, and application load balancers
5
+ for running stateful and long-running applications.
6
+ teamId: "cloud-shepherds"
7
+
@@ -0,0 +1,12 @@
1
+ friendlyName: "DynamoDB Notifications Table"
2
+ description: |
3
+ DynamoDB table tracking notification delivery status and queued messages.
4
+
5
+ Manages notification queue with TTL for automatic cleanup of processed notifications.
6
+ Provides audit trail for compliance and debugging notification issues.
7
+ serviceType: DYNAMODB
8
+ outgoingConnections:
9
+ - targetIdentifier: "api/lambda-orders"
10
+ description: "Triggers order processing Lambda function"
11
+ connectionType: STREAM
12
+
@@ -0,0 +1,9 @@
1
+ friendlyName: "DynamoDB Orders Table"
2
+ description: |
3
+ DynamoDB table storing order history and real-time order status tracking.
4
+
5
+ Optimized for high-throughput reads and writes with TTL for order archival.
6
+ Uses DynamoDB Streams for event-driven order processing workflows.
7
+ serviceType: DYNAMODB
8
+ outgoingConnections: []
9
+
@@ -0,0 +1,9 @@
1
+ friendlyName: "DynamoDB Products Table"
2
+ description: |
3
+ DynamoDB table managing product catalog with full-text search capabilities.
4
+
5
+ Stores product details, pricing, and inventory levels with global tables for multi-region access.
6
+ Integrated with ElastiCache for frequently accessed product data.
7
+ serviceType: DYNAMODB
8
+ outgoingConnections: []
9
+
@@ -0,0 +1,9 @@
1
+ friendlyName: "DynamoDB Users Table"
2
+ description: |
3
+ DynamoDB table storing user profiles and session data with global secondary indexes.
4
+
5
+ Provides single-digit millisecond latency for user lookups and session management.
6
+ Configured with on-demand capacity and point-in-time recovery enabled.
7
+ serviceType: DYNAMODB
8
+ outgoingConnections: []
9
+
@@ -0,0 +1,7 @@
1
+ name: "Data Storage"
2
+ description: |
3
+ Manages database systems and data persistence layers.
4
+ This group handles RDS relational databases, DynamoDB NoSQL tables,
5
+ and data backup/recovery strategies for the entire platform.
6
+ teamId: "data-wizards"
7
+
@@ -0,0 +1,9 @@
1
+ friendlyName: "RDS PostgreSQL Database"
2
+ description: |
3
+ Multi-AZ PostgreSQL RDS instance for transactional data and relational storage.
4
+
5
+ Provides ACID transactions, complex queries, and data consistency for critical business data.
6
+ Configured with automated backups, point-in-time recovery, and read replicas for scaling.
7
+ serviceType: RDS
8
+ outgoingConnections: []
9
+
@@ -0,0 +1,10 @@
1
+ friendlyName: "Redis Cache Server"
2
+ description: |
3
+ High-performance in-memory data store used for caching and session management.
4
+
5
+ This Redis instance provides fast data access for session storage, reducing
6
+ database load and improving application performance. Configured with persistence
7
+ enabled for data durability.
8
+ serviceType: VALKEY
9
+ outgoingConnections: []
10
+
@@ -0,0 +1,12 @@
1
+ friendlyName: "CloudFront CDN Distribution"
2
+ description: |
3
+ CloudFront distribution providing global content delivery with edge caching.
4
+
5
+ Configured with custom SSL certificate, HTTPS enforcement, and optimized
6
+ cache behaviors. Improves website performance and reduces S3 costs by caching content at edge locations.
7
+ serviceType: CLOUDFRONT
8
+ outgoingConnections:
9
+ - targetIdentifier: "frontend/s3-website"
10
+ description: "Origin - S3 static website bucket"
11
+ connectionType: TCP
12
+
@@ -0,0 +1,7 @@
1
+ name: "Frontend Infrastructure"
2
+ description: |
3
+ Manages static website hosting, CDN, and DNS for the web application.
4
+ This group handles all frontend-facing AWS services including S3 buckets
5
+ for static assets, CloudFront for global content delivery, and Route53 for DNS management.
6
+ teamId: "interface-architects"
7
+
@@ -0,0 +1,15 @@
1
+ friendlyName: "Route53 DNS Zone"
2
+ description: |
3
+ Route53 hosted zone managing DNS records for the application domain.
4
+
5
+ Handles domain name resolution with health checks and routing policies.
6
+ Configured with alias records pointing to CloudFront and ALB endpoints.
7
+ serviceType: ROUTE53
8
+ outgoingConnections:
9
+ - targetIdentifier: "frontend/cloudfront"
10
+ description: "DNS resolution to CloudFront distribution"
11
+ connectionType: TCP
12
+ - targetIdentifier: "compute/alb"
13
+ description: "DNS resolution to Application Load Balancer"
14
+ connectionType: TCP
15
+
@@ -0,0 +1,9 @@
1
+ friendlyName: "S3 Static Website Bucket"
2
+ description: |
3
+ S3 bucket hosting static website assets including HTML, CSS, JavaScript, and images.
4
+
5
+ Configured with website hosting enabled, versioning for rollback capability,
6
+ and lifecycle policies for cost optimization. Serves as the origin for CloudFront distribution.
7
+ serviceType: S3
8
+ outgoingConnections: []
9
+
@@ -0,0 +1,15 @@
1
+ name: "The Cloud Shepherds"
2
+ description: |
3
+ Herding clouds and wrangling infrastructure since day one.
4
+ This team manages all things cloud infrastructure, networking, and compute.
5
+ We keep the lights on and the packets flowing.
6
+ teamLead: "Alex Rivera"
7
+ reachability:
8
+ - channel: email
9
+ detail: "cloud-shepherds@k4u.nl"
10
+ - channel: slack
11
+ detail: "#team-cloud-shepherds"
12
+ - channel: phone
13
+ detail: "+31 20 100 2000"
14
+ - channel: pigeon
15
+ detail: "Release the blue pigeon from HQ rooftop"
@@ -0,0 +1,15 @@
1
+ name: "The Data Wizards"
2
+ description: |
3
+ Conjuring data magic and casting database spells daily.
4
+ Masters of persistence, guardians of state, and keepers of the sacred schemas.
5
+ If it needs to be stored, we've got a spell for it.
6
+ teamLead: "Morgan Chen"
7
+ reachability:
8
+ - channel: email
9
+ detail: "data-wizards@k4u.nl"
10
+ - channel: slack
11
+ detail: "#team-data-wizards"
12
+ - channel: phone
13
+ detail: "+31 20 200 3000"
14
+ - channel: teams
15
+ detail: "teams://data-wizards-room"
@@ -0,0 +1,19 @@
1
+ name: "The Interface Architects"
2
+ description: |
3
+ Building bridges between humans and machines since the dawn of APIs.
4
+ From pixels to payloads, we design the experiences that users love.
5
+ Frontend, APIs, and everything in between.
6
+ teamLead: "Jordan Lee"
7
+ reachability:
8
+ - channel: email
9
+ detail: "interface-architects@k4u.nl"
10
+ - channel: slack
11
+ detail: "#team-interface-architects"
12
+ - channel: phone
13
+ detail: "+31 20 300 4000"
14
+ - channel: pagerduty
15
+ detail: "pagerduty://interface-architects"
16
+ - channel: teams
17
+ detail: "teams://interface-architects-room"
18
+ - channel: pigeon
19
+ detail: "Release the red pigeon from HQ rooftop"
@@ -0,0 +1,54 @@
1
+ import { expect, test } from '@playwright/test';
2
+ import type { Page } from '@playwright/test';
3
+
4
+ const logBrowserConsole = (page: Page) => {
5
+ page.on('console', (msg) => {
6
+ console.log(`[browser:${msg.type()}] ${msg.text()}`);
7
+ });
8
+ };
9
+
10
+ const waitForOverlayToDisappear = async (page: Page) => {
11
+ const overlay = page.locator('[data-testid="flow-loading-overlay"]');
12
+ try {
13
+ await overlay.waitFor({ state: 'detached', timeout: 20000 });
14
+ } catch {
15
+ await expect(overlay).toHaveCount(0);
16
+ }
17
+ };
18
+
19
+ const gotoHomeAndWaitForDiagram = async (page: Page) => {
20
+ logBrowserConsole(page);
21
+ await page.goto('/');
22
+ await page.waitForSelector('[data-testid="flow-canvas"]', { timeout: 20000 });
23
+ await expect(page.locator('[data-testid="flow-canvas"]')).toBeVisible();
24
+ await waitForOverlayToDisappear(page);
25
+ const anyNode = page.locator('[data-testid="flow-canvas"] .svelte-flow__node').first();
26
+ await anyNode.waitFor({ state: 'visible', timeout: 20000 });
27
+ };
28
+
29
+ test('home page renders diagram with data', async ({ page }) => {
30
+ await gotoHomeAndWaitForDiagram(page);
31
+ const flowCanvas = page.locator('[data-testid="flow-canvas"]');
32
+ await expect(flowCanvas.locator('.svelte-flow__node').first()).toBeVisible();
33
+ await expect(flowCanvas.getByText('No diagram available.')).toHaveCount(0);
34
+ });
35
+
36
+ test('clicking a group node updates the sidebar selection', async ({ page }) => {
37
+ await gotoHomeAndWaitForDiagram(page);
38
+ const groupNode = page.locator('.svelte-flow__node').filter({ hasText: 'API Services' });
39
+ await groupNode.first().waitFor({ state: 'visible' });
40
+ await groupNode.first().click();
41
+ const sidebar = page.locator('[data-testid="group-sidebar"], aside').filter({ hasText: 'API Services' });
42
+ await expect(sidebar.first()).toBeVisible();
43
+ });
44
+
45
+ test('double clicking a node navigates to the group detail page', async ({ page }) => {
46
+ await gotoHomeAndWaitForDiagram(page);
47
+ const groupNode = page.locator('.svelte-flow__node').filter({ hasText: 'API Services' });
48
+ await groupNode.first().waitFor({ state: 'visible' });
49
+ await groupNode.first().dblclick();
50
+ await page.waitForURL('**/group/api', { timeout: 20000 });
51
+ await page.waitForSelector('[data-testid="flow-canvas"]', { timeout: 20000 });
52
+ await waitForOverlayToDisappear(page);
53
+ await expect(page.locator('h2').filter({ hasText: 'API Services' }).first()).toBeVisible();
54
+ });
File without changes
@@ -0,0 +1,53 @@
1
+ import { test, expect } from '@playwright/test';
2
+
3
+ // Helper to get the header toolbar buttons
4
+ const getToolbarButtons = async (page) => {
5
+ const legendBtn = page.locator('[data-testid="toolbar-legend"]');
6
+ const darkBtn = page.locator('[data-testid="toolbar-darkmode"]');
7
+ const logBtn = page.locator('[data-testid="toolbar-log"]');
8
+ return { legendBtn, darkBtn, logBtn };
9
+ };
10
+
11
+ test.describe('Header Toolbar', () => {
12
+ test.beforeEach(async ({ page }) => {
13
+ await page.goto('/');
14
+ await page.waitForSelector('[data-testid="toolbar-legend"]');
15
+ });
16
+
17
+ test('shows all three toolbar buttons', async ({ page }) => {
18
+ const { legendBtn, darkBtn, logBtn } = await getToolbarButtons(page);
19
+ await expect(legendBtn).toBeVisible();
20
+ await expect(darkBtn).toBeVisible();
21
+ await expect(logBtn).toBeVisible();
22
+ });
23
+
24
+ test('Show/Hide Legend toggles legend', async ({ page }) => {
25
+ const { legendBtn } = await getToolbarButtons(page);
26
+ // Legend should be visible by default
27
+ await expect(page.locator('.pointer-events-none.absolute.bottom-4.right-4')).toBeVisible();
28
+ await legendBtn.click();
29
+ await expect(page.locator('.pointer-events-none.absolute.bottom-4.right-4')).toBeHidden();
30
+ await legendBtn.click();
31
+ await expect(page.locator('.pointer-events-none.absolute.bottom-4.right-4')).toBeVisible();
32
+ });
33
+
34
+ test('Light/Dark mode toggles color mode', async ({ page }) => {
35
+ const { darkBtn } = await getToolbarButtons(page);
36
+ // Default is light mode
37
+ await expect(page.locator('html')).not.toHaveClass(/dark/);
38
+ await darkBtn.click();
39
+ await expect(page.locator('html')).toHaveClass(/dark/);
40
+ await darkBtn.click();
41
+ await expect(page.locator('html')).not.toHaveClass(/dark/);
42
+ });
43
+
44
+ test('Log button logs to console', async ({ page }) => {
45
+ const { logBtn } = await getToolbarButtons(page);
46
+ const [msg] = await Promise.all([
47
+ page.waitForEvent('console', (m) => m.text().includes('[Header] Log button clicked')),
48
+ logBtn.click()
49
+ ]);
50
+ expect(msg.text()).toContain('[Header] Log button clicked');
51
+ });
52
+ });
53
+
@@ -0,0 +1,30 @@
1
+ import { expect, test } from '@playwright/test'
2
+
3
+ const gotoHomeAndWaitForDiagram = async (page: any) => {
4
+ await page.goto('/')
5
+ await page.waitForSelector('[data-testid="flow-canvas"]')
6
+ }
7
+
8
+ test.describe('layout fills viewport', () => {
9
+ test('overview canvas height tracks viewport', async ({ page }) => {
10
+ await gotoHomeAndWaitForDiagram(page)
11
+ const metrics = await page.evaluate(() => {
12
+ const canvas = document.querySelector('[data-testid="flow-canvas"]')
13
+ const sidebar = document.querySelector('[data-testid="group-sidebar"]')
14
+ const header = document.querySelector('header')
15
+ const main = document.querySelector('main')
16
+ const headerHeight = header?.getBoundingClientRect().height ?? 0
17
+ const mainStyles = main ? getComputedStyle(main) : null
18
+ const mainPadding = mainStyles
19
+ ? parseFloat(mainStyles.paddingTop) + parseFloat(mainStyles.paddingBottom)
20
+ : 0
21
+ const availableHeight = window.innerHeight - headerHeight - mainPadding
22
+ const canvasHeight = canvas?.getBoundingClientRect().height ?? 0
23
+ const sidebarHeight = sidebar?.getBoundingClientRect().height ?? 0
24
+ return { canvasHeight, sidebarHeight, availableHeight }
25
+ })
26
+
27
+ expect(metrics.canvasHeight).toBeGreaterThanOrEqual(metrics.availableHeight - 8)
28
+ expect(Math.abs(metrics.canvasHeight - metrics.sidebarHeight)).toBeLessThanOrEqual(4)
29
+ })
30
+ })
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@k-4u/resource-mapper-core",
3
+ "version": "0.0.1",
4
+ "description": "SvelteKit UI template for resource-mapper — used internally by the CLI",
5
+ "keywords": ["architecture", "visualisation", "svelte", "ui"],
6
+ "author": "K-4U",
7
+ "homepage": "https://github.com/K-4U/resource-mapper#readme",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/K-4U/resource-mapper.git",
11
+ "directory": "packages/core"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/K-4U/resource-mapper/issues"
15
+ },
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "type": "module",
20
+ "license": "MIT",
21
+ "dependencies": {
22
+ "@k-4u/resource-mapper": "*",
23
+ "@k-4u/resource-mapper-shared": "*",
24
+ "@xyflow/svelte": "^1.5.1",
25
+ "adm-zip": "^0.5.16",
26
+ "elkjs": "^0.11.0",
27
+ "libavoid-js": "^0.5.0-beta.3",
28
+ "svelte-theme": "^1.4.3",
29
+ "vite-plugin-static-copy": "^3.2.0"
30
+ },
31
+ "devDependencies": {
32
+ "@eslint/compat": "^2.0.2",
33
+ "@eslint/js": "^9.39.2",
34
+ "@iconify/svelte": "^5.2.1",
35
+ "@nx/vite": "^22.5.3",
36
+ "@sveltejs/adapter-auto": "^7.0.1",
37
+ "@sveltejs/adapter-static": "^3.0.10",
38
+ "@sveltejs/kit": "^2.51.0",
39
+ "@sveltejs/vite-plugin-svelte": "^6.2.4",
40
+ "@tailwindcss/typography": "^0.5.19",
41
+ "@tailwindcss/vite": "^4.2.1",
42
+ "@types/adm-zip": "^0.5.7",
43
+ "@types/js-yaml": "^4.0.9",
44
+ "@types/node": "^25",
45
+ "@vitest/browser-playwright": "^4.0.18",
46
+ "@vitest/coverage-v8": "^4.0.18",
47
+ "eslint": "^9.39.2",
48
+ "eslint-config-prettier": "^10.1.8",
49
+ "eslint-plugin-svelte": "^3.15.0",
50
+ "globals": "^17.3.0",
51
+ "playwright": "^1.58.2",
52
+ "prettier": "^3.8.1",
53
+ "prettier-plugin-svelte": "^3.5.0",
54
+ "prettier-plugin-tailwindcss": "^0.7.2",
55
+ "svelte": "^5.51.1",
56
+ "svelte-check": "^4.4.0",
57
+ "tailwindcss": "^4.1.18",
58
+ "typescript": "^5.9.3",
59
+ "typescript-eslint": "^8.55.0",
60
+ "vite": "^7.3.1",
61
+ "vitest": "^4.0.18",
62
+ "vitest-browser-svelte": "^2.0.2"
63
+ },
64
+ "scripts": {
65
+ "dev": "vite",
66
+ "build": "vite build",
67
+ "preview": "vite preview"
68
+ }
69
+ }
@@ -0,0 +1,10 @@
1
+ import { defineConfig } from '@playwright/test';
2
+
3
+ export default defineConfig({
4
+ webServer: {
5
+ command: 'npm run dev -- --host 127.0.0.1 --port 4173',
6
+ port: 4173,
7
+ reuseExistingServer: !process.env.CI
8
+ },
9
+ testDir: 'e2e'
10
+ });
@@ -0,0 +1,32 @@
1
+ import type {Plugin} from 'vite';
2
+ import * as fs from "node:fs";
3
+
4
+ export function mapperDataPlugin(): Plugin {
5
+ const virtualModuleId = 'virtual:mapper-data';
6
+ const resolvedVirtualModuleId = '\0' + virtualModuleId;
7
+
8
+ return {
9
+ name: 'mapper-data-plugin',
10
+ resolveId(id) {
11
+ if (id === virtualModuleId) return resolvedVirtualModuleId;
12
+ },
13
+ load(id) {
14
+ if (id === resolvedVirtualModuleId) {
15
+ const filePath = process.env.VITE_MAPPER_DATA
16
+ let data: string;
17
+
18
+ if (filePath) {
19
+ this.addWatchFile(filePath);
20
+ try {
21
+ data = fs.readFileSync(filePath, 'utf-8');
22
+ } catch (err) {
23
+ console.error(`Failed to read data from ${filePath}: ${err}`);
24
+ return '{}';
25
+ }
26
+ }
27
+
28
+ return `export default ${data};`;
29
+ }
30
+ }
31
+ };
32
+ }
package/project.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "core",
3
+ "projectType": "application",
4
+ "targets": {
5
+ "test": {
6
+ "executor": "nx:run-commands",
7
+ "options": {
8
+ "command": "vitest run",
9
+ "cwd": "packages/core"
10
+ },
11
+ "configurations": {
12
+ "coverage": {
13
+ "command": "vitest run --coverage"
14
+ }
15
+ },
16
+ "outputs": ["{projectRoot}/coverage"]
17
+ },
18
+ "publish": {
19
+ "command": "npm publish --access public",
20
+ "dependsOn": ["build"]
21
+ }
22
+ }
23
+ }
package/src/app.css ADDED
@@ -0,0 +1,125 @@
1
+ @import '@xyflow/svelte/dist/style.css';
2
+ @import "tailwindcss";
3
+
4
+ @plugin '@tailwindcss/typography';
5
+ @custom-variant dark (&:where(.dark, .dark *));
6
+
7
+ html,
8
+ body,
9
+ #svelte {
10
+ height: 100%;
11
+ min-height: 100%;
12
+ }
13
+
14
+ body {
15
+ margin: 0;
16
+ min-height: 100vh;
17
+ display: flex;
18
+ flex-direction: column;
19
+ }
20
+
21
+ @utility big-title {
22
+ @apply uppercase tracking-[0.3em] text-blue-600 dark:text-blue-400;
23
+ }
24
+
25
+ /**
26
+ TODO: The styles below are for all nodes, style them based on the type of node, e.g. .svelte-flow__node[data-type="custom"] { ... }
27
+ */
28
+ .svelte-flow__node {
29
+ @apply gap-1 px-4 py-3 dark:text-white text-black transition-colors duration-300 ease-in-out;
30
+ @apply shadow-sm;
31
+ @apply rounded-lg;
32
+ @apply bg-linear-to-tr from-gray-50 to-gray-100 dark:from-gray-500 dark:to-gray-700;
33
+ }
34
+
35
+ .svelte-flow__node.selected {
36
+ @apply border-blue-400/80 shadow-lg;
37
+ @apply from-blue-400 to-blue-700 dark:from-blue-900 dark:to-blue-950;
38
+ }
39
+
40
+ /* Internal service nodes */
41
+ .svelte-flow__node-service {
42
+ @apply from-green-50 to-green-100 dark:from-green-500 dark:to-green-800;
43
+ }
44
+
45
+ /* External service nodes */
46
+ .svelte-flow__node-external {
47
+ @apply from-yellow-50 to-yellow-100 dark:from-yellow-500 dark:to-yellow-800;
48
+ }
49
+
50
+ /* Service group nodes (partially transparent) */
51
+ .svelte-flow__node-serviceGroup {
52
+ @apply transition-colors duration-300 ease-in-out opacity-60 dark:opacity-40;
53
+ }
54
+
55
+ .svelte-flow__node-serviceGroup.current-group {
56
+ @apply from-green-400 dark:from-green-900 text-blue-600 dark:text-blue-200 to-green-700 dark:to-green-950;
57
+ }
58
+
59
+ .svelte-flow__node-serviceGroup.external-group {
60
+ @apply from-yellow-50 dark:from-yellow-900 text-blue-600 dark:text-blue-200 to-yellow-700 dark:to-yellow-950;
61
+ }
62
+
63
+
64
+ .edge-label {
65
+ @apply absolute bg-slate-900 text-slate-400 px-2 py-0.5 rounded
66
+ text-[10px] font-bold border border-slate-700 whitespace-nowrap
67
+ shadow-lg pointer-events-none transition-colors duration-200 ease-in-out;
68
+ }
69
+
70
+ .edge-label.selected {
71
+ @apply text-blue-400 border-blue-500 bg-slate-800;
72
+ }
73
+
74
+ /* The actual SVG path of the edge */
75
+ .snake-edge-path {
76
+ @apply transition-colors duration-200 ease-in-out;
77
+ stroke: #64748b; /* slate-500 */
78
+ stroke-width: 2px;
79
+ stroke-linejoin: round;
80
+ stroke-linecap: round;
81
+ }
82
+
83
+ .snake-edge-path.selected {
84
+ @apply stroke-blue-500;
85
+ stroke-width: 3px;
86
+ /* This creates a subtle SVG filter-based glow if desired,
87
+ or you can just rely on the stroke color */
88
+ filter: drop-shadow(0 0 2px rgba(59, 130, 246, 0.5));
89
+ }
90
+
91
+ .snake-edge-path.internal {
92
+ @apply stroke-blue-400 dark:stroke-blue-600
93
+ }
94
+
95
+ .svelte-flow__edge {
96
+ @apply stroke-3;
97
+ }
98
+
99
+ .snake-edge-path.incoming {
100
+ @apply stroke-green-400 dark:stroke-green-600;
101
+ }
102
+
103
+ .snake-edge-path.outgoing {
104
+ @apply stroke-sky-400 dark:stroke-sky-600
105
+ }
106
+
107
+ .sidebar-card {
108
+ @apply rounded-xl border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-slate-700 p-4 mt-4
109
+ }
110
+
111
+ .sidebar-card.external {
112
+ @apply border-yellow-400 dark:border-yellow-600 bg-yellow-50 dark:bg-yellow-800
113
+ }
114
+
115
+ .sidebar-card-subtitle {
116
+ @apply text-xl font-semibold text-gray-900 dark:text-white
117
+ }
118
+
119
+ .sidebar-card-title {
120
+ @apply big-title
121
+ }
122
+
123
+ .sidebar-card-contents {
124
+ @apply mt-2 text-sm text-gray-700 dark:text-gray-300
125
+ }