local-serverless-stack 0.17.2 → 1.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 (228) hide show
  1. package/CHANGELOG.md +327 -0
  2. package/README.md +1155 -221
  3. package/assets/icon.svg +37 -0
  4. package/assets/logo.svg +38 -0
  5. package/bin/cli.js +519 -228
  6. package/bin/i18n.js +525 -0
  7. package/dist/client/config-discovery.d.ts.map +1 -1
  8. package/dist/client/config-discovery.js +2 -1
  9. package/dist/client/config-discovery.js.map +1 -1
  10. package/dist/client/http.d.ts +7 -0
  11. package/dist/client/http.d.ts.map +1 -1
  12. package/dist/client/http.js +3 -2
  13. package/dist/client/http.js.map +1 -1
  14. package/dist/client/lifecycle.d.ts +1 -4
  15. package/dist/client/lifecycle.d.ts.map +1 -1
  16. package/dist/client/lifecycle.js +2 -8
  17. package/dist/client/lifecycle.js.map +1 -1
  18. package/dist/client/namespaces/health.d.ts +1 -1
  19. package/dist/client/namespaces/health.d.ts.map +1 -1
  20. package/dist/client/namespaces/queues.d.ts.map +1 -1
  21. package/dist/client/namespaces/queues.js +9 -0
  22. package/dist/client/namespaces/queues.js.map +1 -1
  23. package/dist/client/namespaces/seeds.d.ts +1 -1
  24. package/dist/client/namespaces/services.d.ts +34 -0
  25. package/dist/client/namespaces/services.d.ts.map +1 -1
  26. package/dist/client/namespaces/services.js +3 -0
  27. package/dist/client/namespaces/services.js.map +1 -1
  28. package/dist/client/types.d.ts +17 -5
  29. package/dist/client/types.d.ts.map +1 -1
  30. package/dist/mcp/http.d.ts +15 -0
  31. package/dist/mcp/http.d.ts.map +1 -0
  32. package/dist/mcp/http.js +86 -0
  33. package/dist/mcp/http.js.map +1 -0
  34. package/dist/mcp/protocol.d.ts +36 -0
  35. package/dist/mcp/protocol.d.ts.map +1 -0
  36. package/dist/mcp/protocol.js +96 -0
  37. package/dist/mcp/protocol.js.map +1 -0
  38. package/dist/mcp/server.d.ts +7 -0
  39. package/dist/mcp/server.d.ts.map +1 -0
  40. package/dist/mcp/server.js +41 -0
  41. package/dist/mcp/server.js.map +1 -0
  42. package/dist/mcp/tools.d.ts +18 -0
  43. package/dist/mcp/tools.d.ts.map +1 -0
  44. package/dist/mcp/tools.js +323 -0
  45. package/dist/mcp/tools.js.map +1 -0
  46. package/dist/server/dev/dynamo-proxy.d.ts.map +1 -1
  47. package/dist/server/dev/dynamo-proxy.js +16 -2
  48. package/dist/server/dev/dynamo-proxy.js.map +1 -1
  49. package/dist/server/engine/backends/self-backend.d.ts +11 -2
  50. package/dist/server/engine/backends/self-backend.d.ts.map +1 -1
  51. package/dist/server/engine/backends/self-backend.js +42 -1
  52. package/dist/server/engine/backends/self-backend.js.map +1 -1
  53. package/dist/server/engine/dispatch/dispatcher.js +2 -2
  54. package/dist/server/engine/dispatch/dispatcher.js.map +1 -1
  55. package/dist/server/engine/engine-manager.d.ts +6 -1
  56. package/dist/server/engine/engine-manager.d.ts.map +1 -1
  57. package/dist/server/engine/engine-manager.js +30 -27
  58. package/dist/server/engine/engine-manager.js.map +1 -1
  59. package/dist/server/engine/http/errors.js +1 -1
  60. package/dist/server/engine/http/errors.js.map +1 -1
  61. package/dist/server/engine/http/is-aws-request.d.ts +8 -0
  62. package/dist/server/engine/http/is-aws-request.d.ts.map +1 -0
  63. package/dist/server/engine/http/is-aws-request.js +53 -0
  64. package/dist/server/engine/http/is-aws-request.js.map +1 -0
  65. package/dist/server/engine/http/router.d.ts.map +1 -1
  66. package/dist/server/engine/http/router.js +7 -1
  67. package/dist/server/engine/http/router.js.map +1 -1
  68. package/dist/server/engine/store/engine-store.d.ts +1 -0
  69. package/dist/server/engine/store/engine-store.d.ts.map +1 -1
  70. package/dist/server/engine/store/engine-store.js +2 -1
  71. package/dist/server/engine/store/engine-store.js.map +1 -1
  72. package/dist/server/engine/store/memory-store.d.ts +16 -0
  73. package/dist/server/engine/store/memory-store.d.ts.map +1 -0
  74. package/dist/server/engine/store/memory-store.js +167 -0
  75. package/dist/server/engine/store/memory-store.js.map +1 -0
  76. package/dist/server/engine/store/wal.d.ts +3 -0
  77. package/dist/server/engine/store/wal.d.ts.map +1 -1
  78. package/dist/server/engine/store/wal.js +35 -1
  79. package/dist/server/engine/store/wal.js.map +1 -1
  80. package/dist/server/index.js +159 -44
  81. package/dist/server/index.js.map +1 -1
  82. package/dist/server/routes/config.d.ts.map +1 -1
  83. package/dist/server/routes/config.js +31 -52
  84. package/dist/server/routes/config.js.map +1 -1
  85. package/dist/server/routes/lambdas.d.ts.map +1 -1
  86. package/dist/server/routes/lambdas.js +77 -0
  87. package/dist/server/routes/lambdas.js.map +1 -1
  88. package/dist/server/routes/services.d.ts.map +1 -1
  89. package/dist/server/routes/services.js +288 -24
  90. package/dist/server/routes/services.js.map +1 -1
  91. package/dist/server/runtime/runtime-worker.js +7 -0
  92. package/dist/server/runtime/runtime-worker.js.map +1 -1
  93. package/dist/server/services/bind-host.d.ts +30 -0
  94. package/dist/server/services/bind-host.d.ts.map +1 -0
  95. package/dist/server/services/bind-host.js +182 -0
  96. package/dist/server/services/bind-host.js.map +1 -0
  97. package/dist/server/services/cache-manager.d.ts +7 -1
  98. package/dist/server/services/cache-manager.d.ts.map +1 -1
  99. package/dist/server/services/cache-manager.js +4 -14
  100. package/dist/server/services/cache-manager.js.map +1 -1
  101. package/dist/server/services/cloudformation-parser.js +3 -3
  102. package/dist/server/services/cloudformation-parser.js.map +1 -1
  103. package/dist/server/services/config-manager.d.ts +53 -35
  104. package/dist/server/services/config-manager.d.ts.map +1 -1
  105. package/dist/server/services/config-manager.js +600 -185
  106. package/dist/server/services/config-manager.js.map +1 -1
  107. package/dist/server/services/dynamo-explorer.d.ts +1 -0
  108. package/dist/server/services/dynamo-explorer.d.ts.map +1 -1
  109. package/dist/server/services/dynamo-explorer.js +28 -6
  110. package/dist/server/services/dynamo-explorer.js.map +1 -1
  111. package/dist/server/services/explorer-region.d.ts +2 -0
  112. package/dist/server/services/explorer-region.d.ts.map +1 -0
  113. package/dist/server/services/explorer-region.js +23 -0
  114. package/dist/server/services/explorer-region.js.map +1 -0
  115. package/dist/server/services/gateway-manager.d.ts.map +1 -1
  116. package/dist/server/services/gateway-manager.js +18 -5
  117. package/dist/server/services/gateway-manager.js.map +1 -1
  118. package/dist/server/services/invocation-activity.d.ts +45 -0
  119. package/dist/server/services/invocation-activity.d.ts.map +1 -0
  120. package/dist/server/services/invocation-activity.js +102 -0
  121. package/dist/server/services/invocation-activity.js.map +1 -0
  122. package/dist/server/services/lambda-runtime-manager.d.ts +8 -1
  123. package/dist/server/services/lambda-runtime-manager.d.ts.map +1 -1
  124. package/dist/server/services/lambda-runtime-manager.js +131 -11
  125. package/dist/server/services/lambda-runtime-manager.js.map +1 -1
  126. package/dist/server/services/opensearch-explorer.d.ts.map +1 -1
  127. package/dist/server/services/opensearch-explorer.js +14 -10
  128. package/dist/server/services/opensearch-explorer.js.map +1 -1
  129. package/dist/server/services/project-scope.d.ts +2 -0
  130. package/dist/server/services/project-scope.d.ts.map +1 -0
  131. package/dist/server/services/project-scope.js +23 -0
  132. package/dist/server/services/project-scope.js.map +1 -0
  133. package/dist/server/services/queue-inspector.d.ts.map +1 -1
  134. package/dist/server/services/queue-inspector.js +15 -6
  135. package/dist/server/services/queue-inspector.js.map +1 -1
  136. package/dist/server/services/resource-provisioner.d.ts +19 -3
  137. package/dist/server/services/resource-provisioner.d.ts.map +1 -1
  138. package/dist/server/services/resource-provisioner.js +153 -26
  139. package/dist/server/services/resource-provisioner.js.map +1 -1
  140. package/dist/server/services/s3-explorer.js +4 -4
  141. package/dist/server/services/s3-explorer.js.map +1 -1
  142. package/dist/server/services/secrets-explorer.d.ts.map +1 -1
  143. package/dist/server/services/secrets-explorer.js +10 -3
  144. package/dist/server/services/secrets-explorer.js.map +1 -1
  145. package/dist/server/services/seed-manager.d.ts.map +1 -1
  146. package/dist/server/services/seed-manager.js +28 -14
  147. package/dist/server/services/seed-manager.js.map +1 -1
  148. package/dist/server/services/serverless-state-parser.d.ts +10 -0
  149. package/dist/server/services/serverless-state-parser.d.ts.map +1 -1
  150. package/dist/server/services/serverless-state-parser.js +20 -1
  151. package/dist/server/services/serverless-state-parser.js.map +1 -1
  152. package/dist/server/services/service-registrar.d.ts +13 -1
  153. package/dist/server/services/service-registrar.d.ts.map +1 -1
  154. package/dist/server/services/service-registrar.js +80 -16
  155. package/dist/server/services/service-registrar.js.map +1 -1
  156. package/dist/server/services/service-scanner.d.ts +25 -0
  157. package/dist/server/services/service-scanner.d.ts.map +1 -0
  158. package/dist/server/services/service-scanner.js +219 -0
  159. package/dist/server/services/service-scanner.js.map +1 -0
  160. package/dist/server/services/source-watcher.d.ts.map +1 -1
  161. package/dist/server/services/source-watcher.js +31 -6
  162. package/dist/server/services/source-watcher.js.map +1 -1
  163. package/dist/ui/assets/ApisPage-CTOcNna-.js +1 -0
  164. package/dist/ui/assets/BucketDetailPage-BXW8-FrE.js +1 -0
  165. package/dist/ui/assets/BucketsPage-DY_ITepb.js +1 -0
  166. package/dist/ui/assets/DynamoPage-BnFFKnIU.js +1 -0
  167. package/dist/ui/assets/DynamoTablePage-BLCuyJHU.js +3 -0
  168. package/dist/ui/assets/LambdaDetailPage-D4rZNLRT.js +4 -0
  169. package/dist/ui/assets/LambdasPage-Bg-MWFBb.js +1 -0
  170. package/dist/ui/assets/OnboardingPage-nnl313Fm.js +1 -0
  171. package/dist/ui/assets/OpenSearchCollectionPage-Dn15lH_F.js +1 -0
  172. package/dist/ui/assets/OpenSearchPage-CgD5isok.js +1 -0
  173. package/dist/ui/assets/{OverviewPage-DS6XJ7kG.css → OverviewPage-CSWY71vZ.css} +1 -1
  174. package/dist/ui/assets/OverviewPage-m5sUr8IN.js +1 -0
  175. package/dist/ui/assets/QueueDetailPage-Ch_FDDoN.js +1 -0
  176. package/dist/ui/assets/QueuesPage-C_yDuGDu.js +1 -0
  177. package/dist/ui/assets/SecretsPage-BSGMSoqy.js +1 -0
  178. package/dist/ui/assets/ServiceDetailPage-6KyohyjI.js +2 -0
  179. package/dist/ui/assets/ServicesPage-BbSetOMo.js +2 -0
  180. package/dist/ui/assets/SettingsPage-BgF1jFr6.js +1 -0
  181. package/dist/ui/assets/engine-D0mFFNbL.js +1 -0
  182. package/dist/ui/assets/index-D627ZyYU.css +1 -0
  183. package/dist/ui/assets/index-DuSPnI19.js +37 -0
  184. package/dist/ui/assets/onboarding-DQmlvyWU.js +1 -0
  185. package/dist/ui/assets/resourceIcons-baecADXA.js +1 -0
  186. package/dist/ui/assets/triggerIcons-DIPWQkJ3.js +1 -0
  187. package/dist/ui/favicon.svg +37 -0
  188. package/dist/ui/index.html +5 -3
  189. package/package.json +11 -11
  190. package/dist/server/engine/aoss-sidecar.d.ts +0 -13
  191. package/dist/server/engine/aoss-sidecar.d.ts.map +0 -1
  192. package/dist/server/engine/aoss-sidecar.js +0 -93
  193. package/dist/server/engine/aoss-sidecar.js.map +0 -1
  194. package/dist/server/engine/backends/localstack-backend.d.ts +0 -25
  195. package/dist/server/engine/backends/localstack-backend.d.ts.map +0 -1
  196. package/dist/server/engine/backends/localstack-backend.js +0 -199
  197. package/dist/server/engine/backends/localstack-backend.js.map +0 -1
  198. package/dist/server/engine/engine-backend.d.ts +0 -17
  199. package/dist/server/engine/engine-backend.d.ts.map +0 -1
  200. package/dist/server/engine/engine-backend.js +0 -7
  201. package/dist/server/engine/engine-backend.js.map +0 -1
  202. package/dist/server/services/localstack-manager.d.ts +0 -17
  203. package/dist/server/services/localstack-manager.d.ts.map +0 -1
  204. package/dist/server/services/localstack-manager.js +0 -31
  205. package/dist/server/services/localstack-manager.js.map +0 -1
  206. package/dist/ui/assets/ApisPage-CXYcWDhm.js +0 -1
  207. package/dist/ui/assets/BucketDetailPage-BwS2--Pe.js +0 -1
  208. package/dist/ui/assets/BucketsPage-khuiYc9C.js +0 -1
  209. package/dist/ui/assets/DynamoPage-aYo0QC0N.js +0 -1
  210. package/dist/ui/assets/DynamoTablePage-rFuV2pgd.js +0 -3
  211. package/dist/ui/assets/LambdaDetailPage-CJmu8M_N.js +0 -4
  212. package/dist/ui/assets/LambdasPage-DniNyKMe.js +0 -1
  213. package/dist/ui/assets/OpenSearchCollectionPage-BBwjgbB9.js +0 -1
  214. package/dist/ui/assets/OpenSearchPage-D5RxJGRo.js +0 -1
  215. package/dist/ui/assets/OverviewPage-Cyt1Xdp8.js +0 -1
  216. package/dist/ui/assets/QueueDetailPage-3FPsowIp.js +0 -1
  217. package/dist/ui/assets/QueuesPage-CUoDDgHr.js +0 -1
  218. package/dist/ui/assets/SecretsPage-B_mTnUf3.js +0 -1
  219. package/dist/ui/assets/ServiceDetailPage-BcdSjA6e.js +0 -2
  220. package/dist/ui/assets/ServicesPage-CU6fb3f8.js +0 -2
  221. package/dist/ui/assets/SettingsPage-BG8cYxgC.js +0 -1
  222. package/dist/ui/assets/index-BxwA-UT0.css +0 -1
  223. package/dist/ui/assets/index-DGsXIPJ-.js +0 -37
  224. package/packages/serverless-plugin/README.md +0 -115
  225. package/packages/serverless-plugin/dist/index.d.ts +0 -2
  226. package/packages/serverless-plugin/dist/index.d.ts.map +0 -1
  227. package/packages/serverless-plugin/dist/index.js +0 -107
  228. package/packages/serverless-plugin/dist/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ const t="lss-onboarding-done";function n(){try{return localStorage.getItem(t)==="1"}catch{return!0}}function o(){try{localStorage.setItem(t,"1")}catch{}}export{n as i,o as m};
@@ -0,0 +1 @@
1
+ const s={lambda:"aws-lambda",dynamodb:"aws-dynamodb",sqs:"aws-sqs",sns:"aws-sns",s3:"aws-s3",eventbus:"aws-eventbridge","event-rule":"aws-eventbridge",opensearch:"aws-opensearch","event-source":"aws-lambda"},n={lambdas:{icon:s.lambda,labelKey:"services.groupLambdas"},tables:{icon:s.dynamodb,labelKey:"services.groupTables"},queues:{icon:s.sqs,labelKey:"services.groupQueues"},topics:{icon:s.sns,labelKey:"services.groupTopics"},buckets:{icon:s.s3,labelKey:"services.groupBuckets"},buses:{icon:s.eventbus,labelKey:"services.groupBuses"},eventRules:{icon:s["event-rule"],labelKey:"services.groupRules"},collections:{icon:s.opensearch,labelKey:"services.groupCollections"}},o=["lambdas","tables","queues","topics","buckets","buses","eventRules","collections"],a={dynamodb:"aws-dynamodb",sqs:"aws-sqs",sns:"aws-sns",s3:"aws-s3",events:"aws-eventbridge",lambda:"aws-lambda",sts:"aws-iam",secretsmanager:"aws-secrets-manager",aoss:"aws-opensearch"};function c(e){return a[e]??null}export{o as a,n as b,c as e,s as r};
@@ -0,0 +1 @@
1
+ const t={http:"aws-api-gateway",httpapi:"aws-api-gateway",websocket:"aws-api-gateway",alb:"aws-elb",sqs:"aws-sqs",sns:"aws-sns",s3:"aws-s3",stream:"aws-dynamodb",eventbridge:"aws-eventbridge",schedule:"aws-eventbridge",cloudwatchevent:"aws-eventbridge",cognitouserpool:"aws-cognito"};function w(e){return e.map(s=>{const a=t[s.toLowerCase()];return a?{name:s,icon:a}:{name:s}})}export{w as t};
@@ -0,0 +1,37 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64" role="img" aria-label="LSS Self Engine">
2
+ <title>LSS Self Engine</title>
3
+ <!--
4
+ The mark says what the product is: a chip, not a cloud. The die is the
5
+ orchestrator process; the twelve pins are the AWS services it serves on the
6
+ wire; the bolt is the in-process event delivery (no container in between).
7
+ Reads at 16px as a bolt-in-a-chip and at 512px as a die with pinout.
8
+ -->
9
+ <defs>
10
+ <linearGradient id="lssBody" x1="0" y1="0" x2="1" y2="1">
11
+ <stop offset="0" stop-color="#2dd4bf"/>
12
+ <stop offset="1" stop-color="#0d9488"/>
13
+ </linearGradient>
14
+ </defs>
15
+
16
+ <!-- Pinout: three per edge, tucked inside the die's corner radius. -->
17
+ <g fill="#0f766e">
18
+ <rect x="3" y="22" width="7" height="4" rx="2"/>
19
+ <rect x="3" y="30" width="7" height="4" rx="2"/>
20
+ <rect x="3" y="38" width="7" height="4" rx="2"/>
21
+ <rect x="54" y="22" width="7" height="4" rx="2"/>
22
+ <rect x="54" y="30" width="7" height="4" rx="2"/>
23
+ <rect x="54" y="38" width="7" height="4" rx="2"/>
24
+ <rect x="22" y="3" width="4" height="7" rx="2"/>
25
+ <rect x="30" y="3" width="4" height="7" rx="2"/>
26
+ <rect x="38" y="3" width="4" height="7" rx="2"/>
27
+ <rect x="22" y="54" width="4" height="7" rx="2"/>
28
+ <rect x="30" y="54" width="4" height="7" rx="2"/>
29
+ <rect x="38" y="54" width="4" height="7" rx="2"/>
30
+ </g>
31
+
32
+ <!-- The die. -->
33
+ <rect x="8" y="8" width="48" height="48" rx="12" fill="url(#lssBody)"/>
34
+
35
+ <!-- In-process delivery. -->
36
+ <path d="M34.5 17 L21 34.5 H29.5 L28.5 47 L42 29.5 H33.5 Z" fill="#ffffff"/>
37
+ </svg>
@@ -4,9 +4,11 @@
4
4
  <head>
5
5
  <meta charset="UTF-8" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
- <title>LSS Orchestrator</title>
8
- <script type="module" crossorigin src="/assets/index-DGsXIPJ-.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-BxwA-UT0.css">
7
+ <!-- Default mark; a project's `branding.favicon` replaces it at runtime. -->
8
+ <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
9
+ <title>LSS Self Engine</title>
10
+ <script type="module" crossorigin src="/assets/index-DuSPnI19.js"></script>
11
+ <link rel="stylesheet" crossorigin href="/assets/index-D627ZyYU.css">
10
12
  </head>
11
13
 
12
14
  <body>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "local-serverless-stack",
3
- "version": "0.17.2",
4
- "description": "Local control plane for serverless development with LocalStack orchestration",
3
+ "version": "1.0.1",
4
+ "description": "Local control plane for serverless development — an in-process AWS emulator, no Docker required",
5
5
  "author": "LSS Contributors",
6
6
  "license": "MIT",
7
7
  "bin": {
@@ -33,25 +33,24 @@
33
33
  "local"
34
34
  ],
35
35
  "files": [
36
- "bin/",
37
- "dist/",
38
- "packages/serverless-plugin/dist/",
39
- "README.md",
36
+ "CHANGELOG.md",
40
37
  "LICENSE",
41
- "CHANGELOG.md"
38
+ "README.md",
39
+ "assets/",
40
+ "bin/",
41
+ "dist/"
42
42
  ],
43
43
  "workspaces": [
44
- "packages/*",
45
44
  "src/ui"
46
45
  ],
47
46
  "scripts": {
48
- "build": "npm run ui:build && npm run server:build && npm run client:build && npm run plugin:build",
47
+ "build": "npm run ui:build && npm run server:build && npm run client:build && npm run mcp:build",
49
48
  "server:dev": "tsx watch src/server/index.ts",
50
49
  "server:build": "tsc --project src/server/tsconfig.json",
51
50
  "client:build": "tsc --project src/client/tsconfig.json",
52
51
  "ui:dev": "cd src/ui && npm run dev",
53
52
  "ui:build": "cd src/ui && npm run build",
54
- "plugin:build": "npm run build -w packages/serverless-plugin",
53
+ "icons:aws": "node scripts/generate-aws-icons.mjs",
55
54
  "dev": "concurrently \"npm run server:dev\" \"npm run ui:dev\"",
56
55
  "setup": "npm install && cd src/ui && npm install",
57
56
  "prepublishOnly": "npm run build",
@@ -61,7 +60,8 @@
61
60
  "test:coverage": "jest -c jest.config.js --coverage",
62
61
  "test:integration": "jest -c jest.integration.config.js",
63
62
  "lint": "eslint .",
64
- "lint:fix": "eslint . --fix"
63
+ "lint:fix": "eslint . --fix",
64
+ "mcp:build": "tsc --project src/mcp/tsconfig.json"
65
65
  },
66
66
  "dependencies": {
67
67
  "@aws-sdk/client-dynamodb": "^3.709.0",
@@ -1,13 +0,0 @@
1
- export interface AossSidecarOptions {
2
- port: number;
3
- dataDir: string;
4
- region: string;
5
- account?: string;
6
- }
7
- export interface AossSidecarHandle {
8
- port: number;
9
- endpoint: string;
10
- close(): Promise<void>;
11
- }
12
- export declare function startAossSidecar(opts: AossSidecarOptions): Promise<AossSidecarHandle>;
13
- //# sourceMappingURL=aoss-sidecar.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"aoss-sidecar.d.ts","sourceRoot":"","sources":["../../../src/server/engine/aoss-sidecar.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,kBAAkB;IAGjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA+E3F"}
@@ -1,93 +0,0 @@
1
- // OpenSearch Serverless (aoss) sidecar: the self-engine OpenSearch emulator
2
- // served in-process behind the engine router, on its own port next to a
3
- // LocalStack engine. No LocalStack edition provides aoss, so LSS fills the
4
- // gap itself — the control plane (X-Amz-Target OpenSearchServerless.*) and
5
- // the data plane (/_aoss/<collection>/...) both answer on this listener,
6
- // persisted under the sidecar's own data dir. Never started in self-engine
7
- // mode, where aoss is native.
8
- import http from 'http';
9
- import { EngineBus } from './bus.js';
10
- import { createEngineStore } from './store/engine-store.js';
11
- import { createEngineRequestHandler } from './http/router.js';
12
- import { OpenSearchEmulator } from './emulators/opensearch/index.js';
13
- // Same residency defaults as the self engine (config-manager.ts) — the
14
- // sidecar hosts one emulator, so there is no reason to expose knobs for them.
15
- const IDLE_UNLOAD_MS = 300_000;
16
- const MEMORY_BUDGET_MB = 128;
17
- export async function startAossSidecar(opts) {
18
- const store = createEngineStore({
19
- dataDir: opts.dataDir,
20
- idleUnloadMs: IDLE_UNLOAD_MS,
21
- memoryBudgetMb: MEMORY_BUDGET_MB,
22
- fsync: false,
23
- });
24
- // The emulator resolves collectionEndpoint through ctx.endpoint() at request
25
- // time; a closure over the mutable port keeps it correct once listen() has
26
- // picked the real port (port 0 case).
27
- let boundPort = opts.port;
28
- const ctx = {
29
- config: {
30
- port: opts.port,
31
- dataDir: opts.dataDir,
32
- account: opts.account ?? '000000000000',
33
- region: opts.region,
34
- idleUnloadMs: IDLE_UNLOAD_MS,
35
- memoryBudgetMb: MEMORY_BUDGET_MB,
36
- fsync: false,
37
- fallbackEndpoint: null,
38
- persistence: true,
39
- },
40
- store,
41
- bus: new EngineBus(),
42
- // The OpenSearch emulator never invokes functions; the stub keeps the
43
- // context honest without dragging the dispatcher (and the Lambda runtime)
44
- // into the sidecar.
45
- dispatcher: { invokeFunction: async () => ({ ok: true }) },
46
- endpoint: () => `http://localhost:${boundPort}`,
47
- };
48
- const emulator = new OpenSearchEmulator(ctx);
49
- const handler = createEngineRequestHandler({ ctx, emulators: [emulator] });
50
- const server = http.createServer(handler);
51
- // Keep-alive sockets must be destroyed for server.close() not to hang.
52
- const sockets = new Set();
53
- server.on('connection', socket => {
54
- sockets.add(socket);
55
- socket.on('close', () => sockets.delete(socket));
56
- });
57
- await new Promise((resolve, reject) => {
58
- const onError = (err) => {
59
- server.removeListener('listening', onListening);
60
- if (err.code === 'EADDRINUSE') {
61
- reject(new Error(`aoss sidecar could not bind port ${opts.port}: address already in use. ` +
62
- 'Stop the conflicting process or set aossSidecar.port to a free port.'));
63
- }
64
- else {
65
- reject(err);
66
- }
67
- };
68
- const onListening = () => {
69
- server.removeListener('error', onError);
70
- resolve();
71
- };
72
- server.once('error', onError);
73
- server.once('listening', onListening);
74
- server.listen(opts.port, '0.0.0.0');
75
- });
76
- boundPort = server.address().port;
77
- store.startSweeper();
78
- return {
79
- port: boundPort,
80
- endpoint: `http://localhost:${boundPort}`,
81
- async close() {
82
- await store.flushAll();
83
- store.stopSweeper();
84
- await new Promise(resolve => {
85
- server.close(() => resolve());
86
- for (const socket of sockets)
87
- socket.destroy();
88
- sockets.clear();
89
- });
90
- },
91
- };
92
- }
93
- //# sourceMappingURL=aoss-sidecar.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"aoss-sidecar.js","sourceRoot":"","sources":["../../../src/server/engine/aoss-sidecar.ts"],"names":[],"mappings":"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"}
@@ -1,25 +0,0 @@
1
- import type { EngineBackend } from '../engine-backend.js';
2
- export declare class LocalStackBackend implements EngineBackend {
3
- readonly kind: "localstack";
4
- private process;
5
- private _isRunning;
6
- private endpoint;
7
- private readonly containerName;
8
- private readonly configManager;
9
- constructor();
10
- start(): Promise<void>;
11
- stop(): Promise<void>;
12
- private waitForReady;
13
- isRunning(): boolean;
14
- getEndpoint(): string;
15
- getConfig(): {
16
- endpoint: string;
17
- region: string;
18
- credentials: {
19
- accessKeyId: string;
20
- secretAccessKey: string;
21
- };
22
- };
23
- healthDetail(): Record<string, unknown>;
24
- }
25
- //# sourceMappingURL=localstack-backend.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"localstack-backend.d.ts","sourceRoot":"","sources":["../../../../src/server/engine/backends/localstack-backend.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI1D,qBAAa,iBAAkB,YAAW,aAAa;IACrD,QAAQ,CAAC,IAAI,EAAG,YAAY,CAAU;IACtC,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAS;IAKzB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;;IASxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+HtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAwBb,YAAY;IAmB1B,SAAS,IAAI,OAAO;IAIpB,WAAW,IAAI,MAAM;IAIrB,SAAS;;;;;;;;IAWT,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAQxC"}
@@ -1,199 +0,0 @@
1
- // LocalStack lifecycle backend (docker container, managed/external). This is
2
- // the code that used to live in services/localstack-manager.ts — that module
3
- // is now a thin facade over EngineManager so existing call sites keep working
4
- // regardless of the active engine.
5
- import { spawn, exec } from 'child_process';
6
- import { promisify } from 'util';
7
- import { ConfigManager } from '../../services/config-manager.js';
8
- const execAsync = promisify(exec);
9
- export class LocalStackBackend {
10
- kind = 'localstack';
11
- process = null;
12
- _isRunning = false;
13
- endpoint;
14
- // Container name is scoped to the LocalStack port so multiple LSS instances
15
- // (one per example/project) can launch their own container side by side.
16
- // Falls back to "lss-localstack" when the default 4566 is in use to preserve
17
- // existing teardown scripts that look for that name.
18
- containerName;
19
- configManager;
20
- constructor() {
21
- this.configManager = ConfigManager.getInstance();
22
- this.endpoint = this.configManager.getLocalStackEndpoint();
23
- const port = this.configManager.getLocalStackPort();
24
- this.containerName = port === 4566 ? 'lss-localstack' : `lss-localstack-${port}`;
25
- }
26
- async start() {
27
- if (this._isRunning) {
28
- console.log('⚠️ LocalStack already running');
29
- return;
30
- }
31
- if (this.configManager.isExternal()) {
32
- console.log(`🔗 Using external LocalStack at ${this.endpoint}`);
33
- await this.waitForReady(30);
34
- this._isRunning = true;
35
- console.log('✅ Connected to external LocalStack');
36
- return;
37
- }
38
- try {
39
- // Check if docker is available
40
- await execAsync('docker ps -q', { timeout: 5000 });
41
- }
42
- catch {
43
- throw new Error('Docker is not available or not running. Please start Docker first.');
44
- }
45
- const edition = this.configManager.getLocalStackEdition();
46
- const image = this.configManager.getLocalStackImage();
47
- const authToken = this.configManager.getLocalStackAuthToken();
48
- if (edition === 'pro' && !authToken) {
49
- throw new Error('LocalStack Pro requires LOCALSTACK_AUTH_TOKEN. Set the env var or "localstackAuthToken" in your config.');
50
- }
51
- if (edition === 'community' && !authToken) {
52
- console.warn('⚠️ LOCALSTACK_AUTH_TOKEN not set. Recent localstack/localstack images (>= 2026.5) require a token even for the community edition.');
53
- }
54
- return new Promise((resolve, reject) => {
55
- console.log(`🔄 Starting LocalStack (${image})...`);
56
- const port = this.configManager.getLocalStackPort();
57
- const services = this.configManager.getServices().join(',');
58
- const persistence = this.configManager.isPersistence() ? '1' : '0';
59
- const debug = this.configManager.isDebug() ? '1' : '0';
60
- // Persistence volume is scoped to the container so two LSS instances
61
- // don't share (and corrupt) the same on-disk state.
62
- const volumeName = this.containerName === 'lss-localstack'
63
- ? 'lss-localstack-data'
64
- : `${this.containerName}-data`;
65
- const dockerArgs = [
66
- 'run',
67
- '--rm',
68
- '-p',
69
- `${port}:4566`,
70
- '-v',
71
- `${volumeName}:/var/lib/localstack`,
72
- '-v',
73
- '/var/run/docker.sock:/var/run/docker.sock',
74
- // host.docker.internal resolves natively on Docker Desktop but not on
75
- // Linux; the generated Lambda proxies target it to reach the invoke
76
- // listeners on the host, so map it explicitly (no-op elsewhere).
77
- '--add-host',
78
- 'host.docker.internal:host-gateway',
79
- '--name',
80
- this.containerName,
81
- '-e',
82
- `SERVICES=${services}`,
83
- '-e',
84
- 'LAMBDA_EXECUTOR=local',
85
- // Lambda containers spawned BY LocalStack (which run the proxies) need
86
- // the same host mapping.
87
- '-e',
88
- 'LAMBDA_DOCKER_FLAGS=--add-host host.docker.internal:host-gateway',
89
- '-e',
90
- `PERSISTENCE=${persistence}`,
91
- '-e',
92
- `DEBUG=${debug}`,
93
- ];
94
- if (authToken) {
95
- dockerArgs.push('-e', `LOCALSTACK_AUTH_TOKEN=${authToken}`);
96
- }
97
- dockerArgs.push(image);
98
- this.process = spawn('docker', dockerArgs);
99
- let stderr = '';
100
- let stdout = '';
101
- this.process.stderr?.on('data', data => {
102
- stderr += data.toString();
103
- console.log(`[LocalStack stderr] ${data.toString().trim()}`);
104
- });
105
- this.process.stdout?.on('data', data => {
106
- stdout += data.toString();
107
- console.log(`[LocalStack stdout] ${data.toString().trim()}`);
108
- });
109
- this.process.on('error', error => {
110
- console.error('❌ Failed to start LocalStack process:', error);
111
- reject(error);
112
- });
113
- this.process.on('close', code => {
114
- if (code !== 0) {
115
- console.error(`Container exited with code ${code}`);
116
- console.error('stderr:', stderr);
117
- console.error('stdout:', stdout);
118
- }
119
- });
120
- // Wait for LocalStack to be ready
121
- this.waitForReady()
122
- .then(() => {
123
- this._isRunning = true;
124
- console.log('✅ LocalStack ready');
125
- resolve();
126
- })
127
- .catch(err => {
128
- console.error('LocalStack startup error:', err.message);
129
- this.process?.kill();
130
- reject(err);
131
- });
132
- });
133
- }
134
- async stop() {
135
- if (!this._isRunning) {
136
- return;
137
- }
138
- if (this.configManager.isExternal()) {
139
- console.log('🔗 External LocalStack — leaving container untouched');
140
- this._isRunning = false;
141
- return;
142
- }
143
- console.log('🛑 Stopping LocalStack...');
144
- try {
145
- await execAsync(`docker stop ${this.containerName}`, { timeout: 10000 });
146
- this._isRunning = false;
147
- this.process = null;
148
- console.log('✅ LocalStack stopped');
149
- }
150
- catch (error) {
151
- console.error('⚠️ Error stopping LocalStack:', error instanceof Error ? error.message : 'Unknown error');
152
- this._isRunning = false;
153
- }
154
- }
155
- async waitForReady(maxAttempts = 120) {
156
- for (let i = 0; i < maxAttempts; i++) {
157
- try {
158
- const response = await fetch(`${this.endpoint}/_localstack/health`);
159
- if (response.ok) {
160
- console.log(`✓ LocalStack is responsive (attempt ${i + 1}/${maxAttempts})`);
161
- return;
162
- }
163
- }
164
- catch {
165
- // Ignore fetch errors during startup
166
- if (i % 20 === 0) {
167
- console.log(`⏳ Waiting for LocalStack... (attempt ${i + 1}/${maxAttempts})`);
168
- }
169
- }
170
- await new Promise(resolve => setTimeout(resolve, 1000));
171
- }
172
- throw new Error('LocalStack failed to start in time (120s timeout). Check Docker and container logs.');
173
- }
174
- isRunning() {
175
- return this._isRunning;
176
- }
177
- getEndpoint() {
178
- return this.endpoint;
179
- }
180
- getConfig() {
181
- return {
182
- endpoint: this.endpoint,
183
- region: this.configManager.getRegion(),
184
- credentials: {
185
- accessKeyId: process.env.LOCALSTACK_ACCESS_KEY_ID || 'test',
186
- secretAccessKey: process.env.LOCALSTACK_SECRET_ACCESS_KEY || 'test',
187
- },
188
- };
189
- }
190
- healthDetail() {
191
- return {
192
- endpoint: this.endpoint,
193
- running: this._isRunning,
194
- mode: this.configManager.getMode(),
195
- image: this.configManager.isExternal() ? undefined : this.configManager.getLocalStackImage(),
196
- };
197
- }
198
- }
199
- //# sourceMappingURL=localstack-backend.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"localstack-backend.js","sourceRoot":"","sources":["../../../../src/server/engine/backends/localstack-backend.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- export interface EngineBackend {
2
- readonly kind: 'localstack' | 'self';
3
- start(): Promise<void>;
4
- stop(): Promise<void>;
5
- isRunning(): boolean;
6
- getEndpoint(): string;
7
- getConfig(): {
8
- endpoint: string;
9
- region: string;
10
- credentials: {
11
- accessKeyId: string;
12
- secretAccessKey: string;
13
- };
14
- };
15
- healthDetail(): Record<string, unknown>;
16
- }
17
- //# sourceMappingURL=engine-backend.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"engine-backend.d.ts","sourceRoot":"","sources":["../../../src/server/engine/engine-backend.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAAC;IACrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,SAAS,IAAI,OAAO,CAAC;IACrB,WAAW,IAAI,MAAM,CAAC;IACtB,SAAS,IAAI;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,eAAe,EAAE,MAAM,CAAA;SAAE,CAAC;KAC/D,CAAC;IACF,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC"}
@@ -1,7 +0,0 @@
1
- // Lifecycle seam between the orchestrator and whichever AWS provider is
2
- // active. Provisioning is NOT part of this interface on purpose: both engines
3
- // are driven through the AWS wire API by the existing SDK-based code
4
- // (provisioner, explorers, seeds), so the only thing that varies is lifecycle
5
- // and endpoint. See docs/PRD_SELF_ENGINE.md §5.1.
6
- export {};
7
- //# sourceMappingURL=engine-backend.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"engine-backend.js","sourceRoot":"","sources":["../../../src/server/engine/engine-backend.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,8EAA8E;AAC9E,qEAAqE;AACrE,8EAA8E;AAC9E,kDAAkD"}
@@ -1,17 +0,0 @@
1
- export declare class LocalStackManager {
2
- private static instance;
3
- static getInstance(): LocalStackManager;
4
- start(): Promise<void>;
5
- stop(): Promise<void>;
6
- isRunning(): boolean;
7
- getEndpoint(): string;
8
- getConfig(): {
9
- endpoint: string;
10
- region: string;
11
- credentials: {
12
- accessKeyId: string;
13
- secretAccessKey: string;
14
- };
15
- };
16
- }
17
- //# sourceMappingURL=localstack-manager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"localstack-manager.d.ts","sourceRoot":"","sources":["../../../src/server/services/localstack-manager.ts"],"names":[],"mappings":"AAQA,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoB;IAE3C,MAAM,CAAC,WAAW,IAAI,iBAAiB;IAOjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,SAAS,IAAI,OAAO;IAIpB,WAAW,IAAI,MAAM;IAIrB,SAAS,IAAI;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,eAAe,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE;CAGjH"}
@@ -1,31 +0,0 @@
1
- // Deprecated facade kept so the ~10 existing call sites (provisioner,
2
- // explorers, seeds, dynamo-proxy, routes) stay untouched: they keep importing
3
- // LocalStackManager, but the active provider may be the LocalStack container
4
- // OR the in-process self engine — EngineManager decides from the config.
5
- // New code should use EngineManager directly.
6
- import { EngineManager } from '../engine/engine-manager.js';
7
- export class LocalStackManager {
8
- static instance;
9
- static getInstance() {
10
- if (!LocalStackManager.instance) {
11
- LocalStackManager.instance = new LocalStackManager();
12
- }
13
- return LocalStackManager.instance;
14
- }
15
- async start() {
16
- return EngineManager.getInstance().start();
17
- }
18
- async stop() {
19
- return EngineManager.getInstance().stop();
20
- }
21
- isRunning() {
22
- return EngineManager.getInstance().isRunning();
23
- }
24
- getEndpoint() {
25
- return EngineManager.getInstance().getEndpoint();
26
- }
27
- getConfig() {
28
- return EngineManager.getInstance().getConfig();
29
- }
30
- }
31
- //# sourceMappingURL=localstack-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"localstack-manager.js","sourceRoot":"","sources":["../../../src/server/services/localstack-manager.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,8EAA8E;AAC9E,6EAA6E;AAC7E,yEAAyE;AACzE,8CAA8C;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAC,QAAQ,CAAoB;IAE3C,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;YAChC,iBAAiB,CAAC,QAAQ,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACvD,CAAC;QACD,OAAO,iBAAiB,CAAC,QAAQ,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,KAAK;QACT,OAAO,aAAa,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,aAAa,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAC5C,CAAC;IAED,SAAS;QACP,OAAO,aAAa,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,CAAC;IACjD,CAAC;IAED,WAAW;QACT,OAAO,aAAa,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,CAAC;IACnD,CAAC;IAED,SAAS;QACP,OAAO,aAAa,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,CAAC;IACjD,CAAC;CACF"}
@@ -1 +0,0 @@
1
- import{k as R,l as M,o as q,m as u,e as d,$ as t,t as p,a4 as e,j as n,D as G,E as w,O as H,i,_ as s,f as v,x as O,G as N,g as T,F as I,q as X,w as Y,H as P,C as S,A as y,u as c,R as J,v as _,B as K,I as Q,n as z,b as W,a as x,c as Z}from"./index-DGsXIPJ-.js";const ee=R({__name:"ApisView",setup(V){const k=Z(),f=z([]),h=z(!0),g=z(null),m=z({});let b=null;const F=[{key:"method",label:"Method"},{key:"path",label:"Path"},{key:"functionName",label:"→ Function"},{key:"eventType",label:"Type"},{key:"authorizerName",label:"Auth"},{key:"actions",label:"",align:"right"}],j=[{key:"name",label:"Name"},{key:"type",label:"Type"},{key:"payloadVersion",label:"Payload"},{key:"resultTtlInSeconds",label:"TTL",align:"right"},{key:"identitySource",label:"Identity source"},{key:"target",label:"Function / ARN"}],$=W(()=>({services:f.value.length,routes:f.value.reduce((r,l)=>r+l.routes.length,0),online:f.value.filter(r=>r.status==="online").length}));function B(r){return r.routes.map(l=>({...l}))}function L(r){return r.authorizers.map(l=>({...l,identitySource:l.identitySource.join(", "),target:l.functionName||l.arn||""}))}async function A(){try{f.value=await x.listApis(),g.value=null}catch(r){g.value=r.message||"Failed to load APIs"}finally{h.value=!1}}async function D(r){if(!m.value[r]){m.value={...m.value,[r]:!0};try{const l=await x.clearAuthorizerCache({service:r});k.add({title:"Authorizer cache cleared",description:`${l.removed} cached result${l.removed===1?"":"s"} removed`,variant:"success"})}catch(l){k.add({title:"Failed to clear authorizer cache",description:l.message,variant:"danger"})}finally{m.value={...m.value,[r]:!1}}}}function U(r,l){var a;const o=`curl -X ${l.method} http://localhost:${r.apiPort}${l.path}`;(a=navigator.clipboard)==null||a.writeText(o).then(()=>{k.add({title:"curl command copied",description:o,variant:"success"})})}function C(r){switch(r){case"online":return"success";case"port-conflict":return"warning";default:return"neutral"}}function E(r){return r==="ANY"?"info":"neutral"}return M(()=>{A(),b=window.setInterval(A,1e4)}),q(()=>{b&&window.clearInterval(b)}),(r,l)=>(u(),d(t(p),{direction:"vertical",gap:"1.25rem"},{default:e(()=>[n(t(G),{columns:3,gap:"1rem"},{default:e(()=>[n(t(w),{label:"Services with APIs",value:$.value.services,tone:"info",loading:h.value},null,8,["value","loading"]),n(t(w),{label:"Routes",value:$.value.routes,tone:"info",loading:h.value},null,8,["value","loading"]),n(t(w),{label:"Listeners online",value:$.value.online,tone:"success",loading:h.value},null,8,["value","loading"])]),_:1}),g.value?(u(),d(t(H),{key:0,variant:"danger",dismissible:"",onDismiss:l[0]||(l[0]=o=>g.value=null)},{default:e(()=>[i(s(g.value),1)]),_:1})):v("",!0),h.value&&!f.value.length?(u(),d(t(p),{key:1,direction:"horizontal",justify:"center",align:"center"},{default:e(()=>[n(t(O),{label:"Loading APIs..."})]),_:1})):f.value.length?v("",!0):(u(),d(t(N),{key:2,title:"No APIs registered",description:"Register a microservice that defines http or httpApi events to see its routes here."})),(u(!0),T(I,null,X(f.value,o=>(u(),d(t(Y),{key:o.service,variant:"outline"},{header:e(()=>[n(t(p),{direction:"horizontal",gap:"0.5rem",align:"center",justify:"space-between",wrap:""},{default:e(()=>[n(t(p),{direction:"horizontal",gap:"0.5rem",align:"center",wrap:""},{default:e(()=>[n(t(Q),{to:`/services/${encodeURIComponent(o.service)}`},{default:e(()=>[n(t(c),{weight:"semibold"},{default:e(()=>[i(s(o.service),1)]),_:2},1024)]),_:2},1032,["to"]),o.apiPort?(u(),d(t(_),{key:0,tone:"info",variant:"soft"},{default:e(()=>[i(":"+s(o.apiPort),1)]),_:2},1024)):v("",!0),n(t(_),{tone:C(o.status),variant:"soft"},{default:e(()=>[i(s(o.status),1)]),_:2},1032,["tone"]),o.invokePort?(u(),d(t(_),{key:1,tone:C(o.invokeStatus),variant:"soft"},{default:e(()=>[i(" invoke :"+s(o.invokePort),1)]),_:2},1032,["tone"])):v("",!0),o.stage?(u(),d(t(y),{key:2,size:"sm",variant:"soft"},{default:e(()=>[i("stage: "+s(o.stage),1)]),_:2},1024)):v("",!0)]),_:2},1024),n(t(S),{size:"sm",variant:"ghost",loading:m.value[o.service],onClick:a=>D(o.service)},{default:e(()=>[...l[1]||(l[1]=[i(" Clear authorizer cache ",-1)])]),_:1},8,["loading","onClick"])]),_:2},1024)]),default:e(()=>[n(t(p),{direction:"vertical",gap:"0.75rem"},{default:e(()=>[o.routes.length?(u(),d(t(P),{key:0,columns:F,rows:B(o),"aria-label":"API routes"},{"cell-method":e(({row:a})=>[n(t(_),{tone:E(String(a.method)),variant:"soft"},{default:e(()=>[i(s(a.method),1)]),_:2},1032,["tone"])]),"cell-path":e(({row:a})=>[n(t(c),{family:"mono"},{default:e(()=>[i(s(a.path),1)]),_:2},1024)]),"cell-functionName":e(({row:a})=>[n(t(J),{to:`/lambdas/${encodeURIComponent(String(a.functionName))}`,style:{"text-decoration":"none"}},{default:e(()=>[n(t(y),{size:"sm",variant:"soft",clickable:""},{default:e(()=>[i(s(a.functionName),1)]),_:2},1024)]),_:2},1032,["to"])]),"cell-eventType":e(({row:a})=>[n(t(y),{size:"sm",variant:"soft"},{default:e(()=>[i(s(a.payloadVersion==="2.0"?"v2":"v1"),1)]),_:2},1024)]),"cell-authorizerName":e(({row:a})=>[a.authorizerName?(u(),d(t(y),{key:0,size:"sm",variant:"soft"},{default:e(()=>[i(s(a.authorizerName),1)]),_:2},1024)):(u(),d(t(c),{key:1,tone:"muted"},{default:e(()=>[...l[2]||(l[2]=[i("—",-1)])]),_:1}))]),"cell-actions":e(({row:a})=>[n(t(p),{direction:"horizontal",gap:"0.375rem",justify:"flex-end"},{default:e(()=>[n(t(S),{size:"sm",variant:"ghost",onClick:te=>U(o,a)},{default:e(()=>[...l[3]||(l[3]=[i(" Copy curl ",-1)])]),_:1},8,["onClick"])]),_:2},1024)]),_:2},1032,["rows"])):(u(),d(t(N),{key:1,title:"No routes",description:"This service exposes no http or httpApi routes."})),o.authorizers.length?(u(),T(I,{key:2},[n(t(K)),n(t(c),{weight:"semibold",size:"sm"},{default:e(()=>[...l[4]||(l[4]=[i("Authorizers",-1)])]),_:1}),n(t(P),{columns:j,rows:L(o),"aria-label":"Authorizers"},{"cell-name":e(({row:a})=>[n(t(c),{family:"mono",size:"sm"},{default:e(()=>[i(s(a.name),1)]),_:2},1024)]),"cell-type":e(({row:a})=>[n(t(y),{size:"sm",variant:"soft"},{default:e(()=>[i(s(a.type),1)]),_:2},1024)]),"cell-payloadVersion":e(({row:a})=>[n(t(y),{size:"sm",variant:"soft"},{default:e(()=>[i(s(a.payloadVersion==="2.0"?"v2":"v1"),1)]),_:2},1024)]),"cell-resultTtlInSeconds":e(({row:a})=>[n(t(c),{family:"mono",size:"sm"},{default:e(()=>[i(s(a.resultTtlInSeconds)+"s",1)]),_:2},1024)]),"cell-identitySource":e(({row:a})=>[n(t(c),{family:"mono",size:"xs"},{default:e(()=>[i(s(a.identitySource||"—"),1)]),_:2},1024)]),"cell-target":e(({row:a})=>[a.target?(u(),d(t(c),{key:0,family:"mono",size:"xs"},{default:e(()=>[i(s(a.target),1)]),_:2},1024)):(u(),d(t(c),{key:1,tone:"muted"},{default:e(()=>[...l[5]||(l[5]=[i("—",-1)])]),_:1}))]),_:1},8,["rows"])],64)):v("",!0)]),_:2},1024)]),_:2},1024))),128))]),_:1}))}}),le=R({__name:"ApisPage",setup(V){return(k,f)=>(u(),d(ee))}});export{le as default};
@@ -1 +0,0 @@
1
- import{k as E,l as J,a3 as Q,e as f,$ as t,t as r,a4 as a,a as g,m as c,j as l,C as p,s as W,i,u as B,_ as b,v as X,f as M,O as Y,x as F,g as Z,E as x,D as ee,N as U,a5 as te,a2 as ae,d as T,w as _,G as le,H as ne,I as oe,a6 as ie,F as ue,c as re,n as s,b as se,a1 as de}from"./index-DGsXIPJ-.js";const ce=["href"],fe=E({__name:"BucketDetail",props:{bucketName:{}},emits:["back"],setup(z,{emit:N}){const d=z,S=N,v=re(),u=s(null),k=s([]),h=s(""),K=s(!0),$=s(!1),y=s(null),j=s(""),w=s(""),C=s("text/plain"),V=s(!1),L=[{key:"key",label:"Key"},{key:"size",label:"Size",align:"right"},{key:"lastModified",label:"Modified"},{key:"actions",label:"",align:"right"}],G=se(()=>k.value.reduce((o,e)=>o+(e.size||0),0));function O(o){if(o==null)return"—";if(o===0)return"0 B";const e=["B","KB","MB","GB","TB"],n=Math.floor(Math.log(o)/Math.log(1024));return`${(o/Math.pow(1024,n)).toFixed(n===0?0:1)} ${e[n]}`}function H(o){return o?new Date(o).toLocaleString():"—"}async function D(){try{u.value=await g.getBucket(d.bucketName),y.value=null}catch(o){y.value=o.message||"Failed to load bucket",u.value=null}finally{K.value=!1}}async function m(){$.value=!0;try{const o=await g.listBucketObjects(d.bucketName,{prefix:h.value||void 0,maxKeys:200});k.value=o.objects}catch(o){v.add({title:"Failed to load objects",description:o.message,variant:"danger"})}finally{$.value=!1}}function R(o){return g.bucketObjectContentUrl(d.bucketName,o,!1)}function q(o){return g.bucketObjectContentUrl(d.bucketName,o,!0)}async function A(o){if(confirm(`Delete object "${o}"?`))try{await g.deleteBucketObject(d.bucketName,o),v.add({title:"Object deleted",variant:"info"}),await m()}catch(e){v.add({title:"Failed to delete object",description:e.message,variant:"danger"})}}async function I(){if(!j.value||!w.value){v.add({title:"Key and body are required",variant:"warning"});return}V.value=!0;try{await g.putBucketObject(d.bucketName,{key:j.value,body:w.value,contentType:C.value||void 0}),v.add({title:"Object uploaded",variant:"info"}),j.value="",w.value="",await m(),await D()}catch(o){v.add({title:"Failed to upload object",description:o.message,variant:"danger"})}finally{V.value=!1}}return J(()=>{D(),m()}),Q(()=>d.bucketName,()=>{D(),m()}),(o,e)=>(c(),f(t(r),{direction:"vertical",gap:"1rem"},{default:a(()=>[l(t(r),{direction:"horizontal",gap:"0.5rem",align:"center",justify:"space-between"},{default:a(()=>[l(t(r),{direction:"horizontal",gap:"0.5rem",align:"center"},{default:a(()=>{var n;return[l(t(p),{size:"sm",variant:"ghost",onClick:e[0]||(e[0]=P=>S("back"))},{default:a(()=>[l(t(W),{name:"arrow-left"}),e[9]||(e[9]=i(" Buckets",-1))]),_:1}),l(t(B),{size:"lg",weight:"semibold"},{default:a(()=>[i(b(z.bucketName),1)]),_:1}),(n=u.value)!=null&&n.versioning?(c(),f(t(X),{key:0,tone:"info",variant:"soft"},{default:a(()=>[...e[10]||(e[10]=[i("Versioning",-1)])]),_:1})):M("",!0)]}),_:1}),l(t(p),{size:"sm",variant:"ghost",loading:$.value,onClick:e[1]||(e[1]=n=>m())},{default:a(()=>[...e[11]||(e[11]=[i("Refresh",-1)])]),_:1},8,["loading"])]),_:1}),y.value?(c(),f(t(Y),{key:0,variant:"danger",dismissible:"",onDismiss:e[2]||(e[2]=n=>y.value=null)},{default:a(()=>[i(b(y.value),1)]),_:1})):M("",!0),K.value&&!u.value?(c(),f(t(r),{key:1,direction:"horizontal",justify:"center",align:"center"},{default:a(()=>[l(t(F),{label:"Loading bucket..."})]),_:1})):u.value?(c(),Z(ue,{key:2},[l(t(ee),{columns:4,gap:"0.75rem"},{default:a(()=>[l(t(x),{label:"Objects",value:u.value.objectCount??0,tone:"info"},null,8,["value"]),l(t(x),{label:"Size",value:O(u.value.totalSize),tone:"neutral"},null,8,["value"]),l(t(x),{label:"Versioning",value:u.value.versioning?"Enabled":"Disabled",tone:u.value.versioning?"success":"neutral"},null,8,["value","tone"]),l(t(x),{label:"Notifications",value:u.value.notifications??0,tone:(u.value.notifications??0)>0?"info":"neutral"},null,8,["value","tone"])]),_:1}),l(t(_),{variant:"outline"},{header:a(()=>[l(t(B),{weight:"semibold"},{default:a(()=>[...e[12]||(e[12]=[i("Upload object",-1)])]),_:1})]),default:a(()=>[l(t(r),{direction:"vertical",gap:"0.5rem"},{default:a(()=>[l(t(U),{modelValue:j.value,"onUpdate:modelValue":e[3]||(e[3]=n=>j.value=n),placeholder:"object/key.txt",label:"Key"},null,8,["modelValue"]),l(t(U),{modelValue:C.value,"onUpdate:modelValue":e[4]||(e[4]=n=>C.value=n),placeholder:"text/plain",label:"Content-Type"},null,8,["modelValue"]),l(t(B),{as:"label",tone:"muted",size:"sm"},{default:a(()=>[...e[13]||(e[13]=[i("Body",-1)])]),_:1}),te(T("textarea",{"onUpdate:modelValue":e[5]||(e[5]=n=>w.value=n),rows:"4",style:{width:"100%","font-family":"var(--tree-font-mono, monospace)",padding:"0.5rem"},placeholder:"Hello, world!"},null,512),[[ae,w.value]]),l(t(r),{direction:"horizontal",justify:"flex-end"},{default:a(()=>[l(t(p),{size:"sm",loading:V.value,onClick:I},{default:a(()=>[...e[14]||(e[14]=[i("Upload",-1)])]),_:1},8,["loading"])]),_:1})]),_:1})]),_:1}),l(t(_),{variant:"outline"},{header:a(()=>[l(t(r),{direction:"horizontal",gap:"0.5rem",align:"center",justify:"space-between"},{default:a(()=>[l(t(B),{weight:"semibold"},{default:a(()=>[i("Objects ("+b(k.value.length)+" · "+b(O(G.value))+")",1)]),_:1}),l(t(r),{direction:"horizontal",gap:"0.5rem",align:"center"},{default:a(()=>[l(t(U),{modelValue:h.value,"onUpdate:modelValue":e[6]||(e[6]=n=>h.value=n),placeholder:"prefix filter",size:"sm",onKeyup:e[7]||(e[7]=ie(n=>m(),["enter"]))},null,8,["modelValue"]),l(t(p),{size:"sm",variant:"ghost",onClick:e[8]||(e[8]=n=>m())},{default:a(()=>[...e[15]||(e[15]=[i("Apply",-1)])]),_:1})]),_:1})]),_:1})]),default:a(()=>[$.value?(c(),f(t(r),{key:0,direction:"horizontal",justify:"center",align:"center"},{default:a(()=>[l(t(F),{label:"Loading objects..."})]),_:1})):k.value.length?(c(),f(t(ne),{key:2,columns:L,rows:k.value,"aria-label":"Bucket objects"},{"cell-key":a(({row:n})=>[l(t(oe),{href:R(String(n.key)),external:"",style:{"font-weight":"500"}},{default:a(()=>[i(b(n.key),1)]),_:2},1032,["href"])]),"cell-size":a(({row:n})=>[i(b(O(Number(n.size))),1)]),"cell-lastModified":a(({row:n})=>[i(b(H(n.lastModified)),1)]),"cell-actions":a(({row:n})=>[l(t(r),{direction:"horizontal",gap:"0.25rem",justify:"flex-end"},{default:a(()=>[T("a",{href:q(String(n.key)),target:"_blank",rel:"noopener noreferrer",style:{"text-decoration":"none"}},[l(t(p),{size:"sm",variant:"ghost"},{default:a(()=>[...e[16]||(e[16]=[i("Download",-1)])]),_:1})],8,ce),l(t(p),{size:"sm",variant:"ghost",tone:"danger",onClick:P=>A(String(n.key))},{default:a(()=>[...e[17]||(e[17]=[i(" Delete ",-1)])]),_:1},8,["onClick"])]),_:2},1024)]),_:1},8,["rows"])):(c(),f(t(le),{key:1,title:"No objects",description:"This bucket is empty (or the prefix filter excluded everything)."}))]),_:1})],64)):M("",!0)]),_:1}))}}),me=E({__name:"BucketDetailPage",props:{bucketName:{}},setup(z){const N=de();function d(){N.push("/buckets")}return(S,v)=>(c(),f(fe,{"bucket-name":z.bucketName,onBack:d},null,8,["bucket-name"]))}});export{me as default};
@@ -1 +0,0 @@
1
- import{k as C,a1 as M,l as N,o as D,m as i,e as u,$ as a,t as b,a4 as t,j as o,D as O,E as p,O as V,i as s,_ as c,f as T,w as U,x as L,G as E,H as F,C as G,v as _,R as P,A as q,u as y,I as A,n as f,b as w,a as z}from"./index-DGsXIPJ-.js";const H=C({__name:"BucketsView",setup(j){const $=M(),r=f([]),B=f({}),d=f(!0),v=f(null);let m=null;const x=[{key:"name",label:"Bucket"},{key:"service",label:"Service"},{key:"objectCount",label:"Objects",align:"right"},{key:"totalSize",label:"Size",align:"right"},{key:"versioning",label:"Versioning"},{key:"notifications",label:"Notifications",align:"right"},{key:"actions",label:"",align:"right"}],R=w(()=>r.value.map(n=>({...n,service:B.value[n.name]||""}))),g=w(()=>({buckets:r.value.length,objects:r.value.reduce((n,l)=>n+(l.objectCount||0),0),size:r.value.reduce((n,l)=>n+(l.totalSize||0),0)}));function h(n){if(n==null)return"—";if(n===0)return"0 B";const l=["B","KB","MB","GB","TB"],e=Math.floor(Math.log(n)/Math.log(1024));return`${(n/Math.pow(1024,e)).toFixed(e===0?0:1)} ${l[e]}`}async function S(){try{const[n,l]=await Promise.all([z.listBuckets(),z.listResourceOwners().catch(()=>({tables:[],queues:[],topics:[],buckets:[]}))]);r.value=n;const e={};for(const k of l.buckets||[])e[k.name]=k.service;B.value=e,v.value=null}catch(n){v.value=n.message||"Failed to load buckets"}finally{d.value=!1}}function I(n){$.push(`/buckets/${encodeURIComponent(n)}`)}return N(()=>{S(),m=window.setInterval(S,1e4)}),D(()=>{m&&window.clearInterval(m)}),(n,l)=>(i(),u(a(b),{direction:"vertical",gap:"1.25rem"},{default:t(()=>[o(a(O),{columns:3,gap:"1rem"},{default:t(()=>[o(a(p),{label:"Buckets",value:g.value.buckets,tone:"info",loading:d.value},null,8,["value","loading"]),o(a(p),{label:"Objects",value:g.value.objects,tone:"success",loading:d.value},null,8,["value","loading"]),o(a(p),{label:"Total size",value:h(g.value.size),tone:"neutral",loading:d.value},null,8,["value","loading"])]),_:1}),v.value?(i(),u(a(V),{key:0,variant:"danger",dismissible:"",onDismiss:l[0]||(l[0]=e=>v.value=null)},{default:t(()=>[s(c(v.value),1)]),_:1})):T("",!0),o(a(U),{variant:"outline"},{header:t(()=>[o(a(b),{direction:"horizontal",gap:"0.5rem",align:"center",justify:"space-between"},{default:t(()=>[o(a(y),{weight:"semibold"},{default:t(()=>[...l[1]||(l[1]=[s("S3 Buckets",-1)])]),_:1}),o(a(y),{tone:"muted"},{default:t(()=>[...l[2]||(l[2]=[s("Refreshes every 10s",-1)])]),_:1})]),_:1})]),default:t(()=>[d.value?(i(),u(a(b),{key:0,direction:"horizontal",justify:"center",align:"center"},{default:t(()=>[o(a(L),{label:"Loading buckets..."})]),_:1})):r.value.length?(i(),u(a(F),{key:2,columns:x,rows:R.value,"aria-label":"S3 buckets"},{"cell-name":t(({row:e})=>[o(a(A),{to:`/buckets/${encodeURIComponent(String(e.name))}`,style:{"font-weight":"600"}},{default:t(()=>[s(c(e.name),1)]),_:2},1032,["to"])]),"cell-service":t(({row:e})=>[e.service?(i(),u(a(P),{key:0,to:`/services/${encodeURIComponent(String(e.service))}`,style:{"text-decoration":"none"}},{default:t(()=>[o(a(q),{size:"sm",variant:"soft",clickable:""},{default:t(()=>[s(c(e.service),1)]),_:2},1024)]),_:2},1032,["to"])):(i(),u(a(y),{key:1,tone:"muted",size:"xs"},{default:t(()=>[...l[3]||(l[3]=[s("unmanaged",-1)])]),_:1}))]),"cell-objectCount":t(({row:e})=>[o(a(_),{tone:"info",variant:"soft"},{default:t(()=>[s(c(e.objectCount??0),1)]),_:2},1024)]),"cell-totalSize":t(({row:e})=>[s(c(h(e.totalSize)),1)]),"cell-versioning":t(({row:e})=>[o(a(_),{tone:e.versioning?"success":"neutral",variant:"soft"},{default:t(()=>[s(c(e.versioning?"Enabled":"Disabled"),1)]),_:2},1032,["tone"])]),"cell-notifications":t(({row:e})=>[o(a(_),{tone:Number(e.notifications)>0?"info":"neutral",variant:"soft"},{default:t(()=>[s(c(e.notifications??0),1)]),_:2},1032,["tone"])]),"cell-actions":t(({row:e})=>[o(a(G),{size:"sm",variant:"ghost",onClick:k=>I(String(e.name))},{default:t(()=>[...l[4]||(l[4]=[s(" Open ",-1)])]),_:1},8,["onClick"])]),_:1},8,["rows"])):(i(),u(a(E),{key:1,title:"No buckets found",description:"Register a microservice that defines S3 resources or create buckets directly in LocalStack."}))]),_:1})]),_:1}))}}),J=C({__name:"BucketsPage",setup(j){return($,r)=>(i(),u(H))}});export{J as default};