local-serverless-stack 0.0.11 → 0.0.12
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.
- package/CHANGELOG.md +13 -0
- package/dist/server/routes/dynamo.d.ts.map +1 -1
- package/dist/server/routes/dynamo.js +14 -10
- package/dist/server/routes/dynamo.js.map +1 -1
- package/dist/server/routes/resources.d.ts.map +1 -1
- package/dist/server/routes/resources.js +3 -2
- package/dist/server/routes/resources.js.map +1 -1
- package/dist/server/routes/seeds.d.ts.map +1 -1
- package/dist/server/routes/seeds.js +12 -6
- package/dist/server/routes/seeds.js.map +1 -1
- package/dist/server/services/dynamo-explorer.d.ts +13 -13
- package/dist/server/services/dynamo-explorer.d.ts.map +1 -1
- package/dist/server/services/dynamo-explorer.js +50 -37
- package/dist/server/services/dynamo-explorer.js.map +1 -1
- package/dist/server/services/resource-provisioner.d.ts +1 -1
- package/dist/server/services/resource-provisioner.d.ts.map +1 -1
- package/dist/server/services/resource-provisioner.js +16 -11
- package/dist/server/services/resource-provisioner.js.map +1 -1
- package/dist/server/services/seed-manager.d.ts +10 -9
- package/dist/server/services/seed-manager.d.ts.map +1 -1
- package/dist/server/services/seed-manager.js +44 -34
- package/dist/server/services/seed-manager.js.map +1 -1
- package/dist/ui/assets/index-iqHgjD5V.js +30 -0
- package/dist/ui/index.html +1 -1
- package/package.json +1 -1
- package/dist/ui/assets/index-BNgGSqP5.js +0 -30
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,19 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.0.12] - 2026-05-19
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **Region selector in the dashboard navbar** (AWS Console–style). The selected region is persisted in `localStorage` and is automatically appended as `?region=<value>` to every API request. The Overview, DynamoDB, and Seeds tabs now reload from scratch when the region changes (keyed remount).
|
|
12
|
+
- **`examples/sample-microservice`**: end-to-end test microservice (`serverless.yml` + JS handlers) that exercises DynamoDB (PK-only / composite key + GSI / stream), SQS, SNS and Lambda event sources — meant for poking at the dashboard with real data. Includes its own `lss.config.json` (default ports), seed fixtures for Users/Orders, and `npm run lss:*` scripts that delegate to the local LSS CLI via relative paths.
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
- `DynamoExplorer`, `SeedManager`, and `ResourceProvisioner.listAllResources` now keep a per-region client cache and accept an optional `region` argument on every public method. Each `/api/dynamo/*`, `/api/seeds/*`, and `/api/resources` route reads `?region=` from the query string and forwards it through.
|
|
16
|
+
- Auto-seed on table creation now passes the provisioning region down so seeds land in the correct namespace when a service is registered in a non-default region.
|
|
17
|
+
|
|
18
|
+
### Known limitations
|
|
19
|
+
- The **Queues** tab is not yet region-aware — `QueueInspector` still polls the singleton's region (the one set by the most recently registered service). A region-aware refactor of the inspector is planned for a follow-up.
|
|
20
|
+
|
|
8
21
|
## [0.0.11] - 2026-05-18
|
|
9
22
|
|
|
10
23
|
### Added
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamo.d.ts","sourceRoot":"","sources":["../../../src/server/routes/dynamo.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,MAAM,4CAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"dynamo.d.ts","sourceRoot":"","sources":["../../../src/server/routes/dynamo.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAkIxB,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,CAAC"}
|
|
@@ -14,9 +14,13 @@ function fail(res, error, status = 500) {
|
|
|
14
14
|
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
15
15
|
return res.status(status).json({ error: message });
|
|
16
16
|
}
|
|
17
|
-
|
|
17
|
+
function getRegion(req) {
|
|
18
|
+
const r = req.query.region;
|
|
19
|
+
return typeof r === 'string' && r ? r : undefined;
|
|
20
|
+
}
|
|
21
|
+
router.get('/tables', async (req, res) => {
|
|
18
22
|
try {
|
|
19
|
-
const tables = await explorer.listTables();
|
|
23
|
+
const tables = await explorer.listTables(getRegion(req));
|
|
20
24
|
res.json({ tables });
|
|
21
25
|
}
|
|
22
26
|
catch (error) {
|
|
@@ -28,7 +32,7 @@ router.get('/tables/:name', async (req, res) => {
|
|
|
28
32
|
if (!isValidName(name))
|
|
29
33
|
return fail(res, new Error('Invalid table name'), 400);
|
|
30
34
|
try {
|
|
31
|
-
const detail = await explorer.describeTable(name);
|
|
35
|
+
const detail = await explorer.describeTable(name, getRegion(req));
|
|
32
36
|
if (!detail)
|
|
33
37
|
return res.status(404).json({ error: 'Table not found' });
|
|
34
38
|
return res.json(detail);
|
|
@@ -42,7 +46,7 @@ router.get('/tables/:name/ttl', async (req, res) => {
|
|
|
42
46
|
if (!isValidName(name))
|
|
43
47
|
return fail(res, new Error('Invalid table name'), 400);
|
|
44
48
|
try {
|
|
45
|
-
return res.json(await explorer.describeTtl(name));
|
|
49
|
+
return res.json(await explorer.describeTtl(name, getRegion(req)));
|
|
46
50
|
}
|
|
47
51
|
catch (error) {
|
|
48
52
|
return fail(res, error);
|
|
@@ -57,7 +61,7 @@ router.put('/tables/:name/ttl', async (req, res) => {
|
|
|
57
61
|
return fail(res, new Error('enabled (boolean) is required'), 400);
|
|
58
62
|
}
|
|
59
63
|
try {
|
|
60
|
-
return res.json(await explorer.setTtl(name, enabled, attributeName));
|
|
64
|
+
return res.json(await explorer.setTtl(name, enabled, attributeName, getRegion(req)));
|
|
61
65
|
}
|
|
62
66
|
catch (error) {
|
|
63
67
|
return fail(res, error, 400);
|
|
@@ -68,7 +72,7 @@ router.post('/tables/:name/scan', async (req, res) => {
|
|
|
68
72
|
if (!isValidName(name))
|
|
69
73
|
return fail(res, new Error('Invalid table name'), 400);
|
|
70
74
|
try {
|
|
71
|
-
return res.json(await explorer.scan(name, req.body ?? {}));
|
|
75
|
+
return res.json(await explorer.scan(name, req.body ?? {}, getRegion(req)));
|
|
72
76
|
}
|
|
73
77
|
catch (error) {
|
|
74
78
|
return fail(res, error, 400);
|
|
@@ -79,7 +83,7 @@ router.post('/tables/:name/query', async (req, res) => {
|
|
|
79
83
|
if (!isValidName(name))
|
|
80
84
|
return fail(res, new Error('Invalid table name'), 400);
|
|
81
85
|
try {
|
|
82
|
-
return res.json(await explorer.query(name, req.body ?? {}));
|
|
86
|
+
return res.json(await explorer.query(name, req.body ?? {}, getRegion(req)));
|
|
83
87
|
}
|
|
84
88
|
catch (error) {
|
|
85
89
|
return fail(res, error, 400);
|
|
@@ -93,7 +97,7 @@ router.post('/tables/:name/items/get', async (req, res) => {
|
|
|
93
97
|
if (!key || typeof key !== 'object')
|
|
94
98
|
return fail(res, new Error('key is required'), 400);
|
|
95
99
|
try {
|
|
96
|
-
const item = await explorer.getItem(name, key);
|
|
100
|
+
const item = await explorer.getItem(name, key, getRegion(req));
|
|
97
101
|
return res.json({ item });
|
|
98
102
|
}
|
|
99
103
|
catch (error) {
|
|
@@ -109,7 +113,7 @@ router.post('/tables/:name/items', async (req, res) => {
|
|
|
109
113
|
return fail(res, new Error('item must be a plain object'), 400);
|
|
110
114
|
}
|
|
111
115
|
try {
|
|
112
|
-
await explorer.putItem(name, item);
|
|
116
|
+
await explorer.putItem(name, item, getRegion(req));
|
|
113
117
|
return res.json({ success: true });
|
|
114
118
|
}
|
|
115
119
|
catch (error) {
|
|
@@ -124,7 +128,7 @@ router.post('/tables/:name/items/delete', async (req, res) => {
|
|
|
124
128
|
if (!key || typeof key !== 'object')
|
|
125
129
|
return fail(res, new Error('key is required'), 400);
|
|
126
130
|
try {
|
|
127
|
-
await explorer.deleteItem(name, key);
|
|
131
|
+
await explorer.deleteItem(name, key, getRegion(req));
|
|
128
132
|
return res.json({ success: true });
|
|
129
133
|
}
|
|
130
134
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamo.js","sourceRoot":"","sources":["../../../src/server/routes/dynamo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;AACxB,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;AAE9C,SAAS,WAAW,CAAC,IAAa;IAChC,OAAO,CACL,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,CAAC,MAAM,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,IAAI,GAAG;QAClB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QACnB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACpB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CACrB,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,GAAa,EAAE,KAAc,EAAE,MAAM,GAAG,GAAG;IACvD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;IACzE,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"dynamo.js","sourceRoot":"","sources":["../../../src/server/routes/dynamo.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../src/server/routes/resources.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,MAAM,4CAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../src/server/routes/resources.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAcxB,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,CAAC"}
|
|
@@ -3,9 +3,10 @@ import { ResourceProvisioner } from '../services/resource-provisioner.js';
|
|
|
3
3
|
const router = Router();
|
|
4
4
|
const provisioner = ResourceProvisioner.getInstance();
|
|
5
5
|
// List all provisioned resources
|
|
6
|
-
router.get('/', async (
|
|
6
|
+
router.get('/', async (req, res) => {
|
|
7
7
|
try {
|
|
8
|
-
const
|
|
8
|
+
const region = typeof req.query.region === 'string' && req.query.region ? req.query.region : undefined;
|
|
9
|
+
const resources = await provisioner.listAllResources(region);
|
|
9
10
|
res.json(resources);
|
|
10
11
|
}
|
|
11
12
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../../src/server/routes/resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;AACxB,MAAM,WAAW,GAAG,mBAAmB,CAAC,WAAW,EAAE,CAAC;AAEtD,iCAAiC;AACjC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"resources.js","sourceRoot":"","sources":["../../../src/server/routes/resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;AACxB,MAAM,WAAW,GAAG,mBAAmB,CAAC,WAAW,EAAE,CAAC;AAEtD,iCAAiC;AACjC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACvG,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC7D,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seeds.d.ts","sourceRoot":"","sources":["../../../src/server/routes/seeds.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"seeds.d.ts","sourceRoot":"","sources":["../../../src/server/routes/seeds.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAiExB,OAAO,EAAE,MAAM,IAAI,WAAW,EAAE,CAAC"}
|
|
@@ -10,9 +10,13 @@ function isValidTableName(name) {
|
|
|
10
10
|
!name.includes('..') &&
|
|
11
11
|
!name.includes('\\'));
|
|
12
12
|
}
|
|
13
|
-
|
|
13
|
+
function getRegion(req) {
|
|
14
|
+
const r = req.query.region;
|
|
15
|
+
return typeof r === 'string' && r ? r : undefined;
|
|
16
|
+
}
|
|
17
|
+
router.get('/', async (req, res) => {
|
|
14
18
|
try {
|
|
15
|
-
const entries = await seeds.list();
|
|
19
|
+
const entries = await seeds.list(getRegion(req));
|
|
16
20
|
res.json({
|
|
17
21
|
seedsDir: ConfigManager.getInstance().getSeedsDir(),
|
|
18
22
|
entries,
|
|
@@ -29,9 +33,10 @@ router.post('/run', async (req, res) => {
|
|
|
29
33
|
if (tableName !== undefined && !isValidTableName(tableName)) {
|
|
30
34
|
return res.status(400).json({ error: 'Invalid tableName' });
|
|
31
35
|
}
|
|
36
|
+
const region = getRegion(req);
|
|
32
37
|
const result = tableName
|
|
33
|
-
? [await seeds.seedTable(tableName)]
|
|
34
|
-
: await seeds.seedAll();
|
|
38
|
+
? [await seeds.seedTable(tableName, region)]
|
|
39
|
+
: await seeds.seedAll(region);
|
|
35
40
|
return res.json({ results: result });
|
|
36
41
|
}
|
|
37
42
|
catch (error) {
|
|
@@ -45,9 +50,10 @@ router.post('/clear', async (req, res) => {
|
|
|
45
50
|
if (tableName !== undefined && !isValidTableName(tableName)) {
|
|
46
51
|
return res.status(400).json({ error: 'Invalid tableName' });
|
|
47
52
|
}
|
|
53
|
+
const region = getRegion(req);
|
|
48
54
|
const result = tableName
|
|
49
|
-
? [await seeds.clearTable(tableName)]
|
|
50
|
-
: await seeds.clearAllSeeded();
|
|
55
|
+
? [await seeds.clearTable(tableName, region)]
|
|
56
|
+
: await seeds.clearAllSeeded(region);
|
|
51
57
|
return res.json({ results: result });
|
|
52
58
|
}
|
|
53
59
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seeds.js","sourceRoot":"","sources":["../../../src/server/routes/seeds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;AACxB,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;AAExC,SAAS,gBAAgB,CAAC,IAAa;IACrC,OAAO,CACL,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,CAAC,MAAM,GAAG,CAAC;QACf,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QACnB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACpB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CACrB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"seeds.js","sourceRoot":"","sources":["../../../src/server/routes/seeds.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,22 +44,22 @@ export interface ScanQueryOutput {
|
|
|
44
44
|
}
|
|
45
45
|
export declare class DynamoExplorer {
|
|
46
46
|
private static instance;
|
|
47
|
-
private
|
|
48
|
-
private
|
|
47
|
+
private clients;
|
|
48
|
+
private defaultRegion;
|
|
49
49
|
private constructor();
|
|
50
50
|
static getInstance(): DynamoExplorer;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
listTables(): Promise<DynamoTableSummary[]>;
|
|
51
|
+
setDefaultRegion(region: string): void;
|
|
52
|
+
private clientFor;
|
|
53
|
+
listTables(region?: string): Promise<DynamoTableSummary[]>;
|
|
54
54
|
private summarize;
|
|
55
|
-
describeTable(name: string): Promise<DynamoTableDetail | null>;
|
|
56
|
-
describeTtl(name: string): Promise<TtlInfo>;
|
|
57
|
-
setTtl(name: string, enabled: boolean, attributeName?: string): Promise<TtlInfo>;
|
|
58
|
-
scan(name: string, input: ScanQueryInput): Promise<ScanQueryOutput>;
|
|
59
|
-
query(name: string, input: ScanQueryInput): Promise<ScanQueryOutput>;
|
|
60
|
-
getItem(name: string, key: Record<string, unknown
|
|
61
|
-
putItem(name: string, item: Record<string, unknown
|
|
62
|
-
deleteItem(name: string, key: Record<string, unknown
|
|
55
|
+
describeTable(name: string, region?: string): Promise<DynamoTableDetail | null>;
|
|
56
|
+
describeTtl(name: string, region?: string): Promise<TtlInfo>;
|
|
57
|
+
setTtl(name: string, enabled: boolean, attributeName?: string, region?: string): Promise<TtlInfo>;
|
|
58
|
+
scan(name: string, input: ScanQueryInput, region?: string): Promise<ScanQueryOutput>;
|
|
59
|
+
query(name: string, input: ScanQueryInput, region?: string): Promise<ScanQueryOutput>;
|
|
60
|
+
getItem(name: string, key: Record<string, unknown>, region?: string): Promise<Record<string, unknown> | null>;
|
|
61
|
+
putItem(name: string, item: Record<string, unknown>, region?: string): Promise<void>;
|
|
62
|
+
deleteItem(name: string, key: Record<string, unknown>, region?: string): Promise<void>;
|
|
63
63
|
private marshallExpressionValues;
|
|
64
64
|
private formatPagedOutput;
|
|
65
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamo-explorer.d.ts","sourceRoot":"","sources":["../../../src/server/services/dynamo-explorer.ts"],"names":[],"mappings":"AAAA,OAAO,EAYL,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACpC,MAAM,0BAA0B,CAAC;AAIlC,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;IAC5C,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,GAAG,EAAE,OAAO,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,+BAA+B,EAAE,CAAC;IACxC,IAAI,EAAE,8BAA8B,EAAE,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,yBAAyB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiB;IACxC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"dynamo-explorer.d.ts","sourceRoot":"","sources":["../../../src/server/services/dynamo-explorer.ts"],"names":[],"mappings":"AAAA,OAAO,EAYL,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACpC,MAAM,0BAA0B,CAAC;AAIlC,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;IAC5C,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,GAAG,EAAE,OAAO,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,+BAA+B,EAAE,CAAC;IACxC,IAAI,EAAE,8BAA8B,EAAE,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wBAAwB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,yBAAyB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC5C;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiB;IACxC,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,aAAa,CAAuB;IAE5C,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,cAAc;IAKpC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAItC,OAAO,CAAC,SAAS;IAWX,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAQlD,SAAS;IAmCjB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAgB/E,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAa5D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBjG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAsBpF,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA2BrF,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAW7G,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBpF,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5F,OAAO,CAAC,wBAAwB;IAahC,OAAO,CAAC,iBAAiB;CAa1B"}
|
|
@@ -3,36 +3,41 @@ import { marshall, unmarshall } from '@aws-sdk/util-dynamodb';
|
|
|
3
3
|
import { LocalStackManager } from './localstack-manager.js';
|
|
4
4
|
export class DynamoExplorer {
|
|
5
5
|
static instance;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
constructor() {
|
|
9
|
-
this.init(this.currentRegion);
|
|
10
|
-
}
|
|
6
|
+
clients = new Map();
|
|
7
|
+
defaultRegion = 'us-east-1';
|
|
8
|
+
constructor() { }
|
|
11
9
|
static getInstance() {
|
|
12
10
|
if (!DynamoExplorer.instance)
|
|
13
11
|
DynamoExplorer.instance = new DynamoExplorer();
|
|
14
12
|
return DynamoExplorer.instance;
|
|
15
13
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
14
|
+
setDefaultRegion(region) {
|
|
15
|
+
if (region)
|
|
16
|
+
this.defaultRegion = region;
|
|
17
|
+
}
|
|
18
|
+
clientFor(region) {
|
|
19
|
+
const r = region || this.defaultRegion;
|
|
20
|
+
let client = this.clients.get(r);
|
|
21
|
+
if (!client) {
|
|
22
|
+
const baseConfig = LocalStackManager.getInstance().getConfig();
|
|
23
|
+
client = new DynamoDBClient({ ...baseConfig, region: r });
|
|
24
|
+
this.clients.set(r, client);
|
|
25
|
+
}
|
|
26
|
+
return client;
|
|
24
27
|
}
|
|
25
|
-
async listTables() {
|
|
26
|
-
const
|
|
28
|
+
async listTables(region) {
|
|
29
|
+
const client = this.clientFor(region);
|
|
30
|
+
const list = await client.send(new ListTablesCommand({}));
|
|
27
31
|
const names = list.TableNames ?? [];
|
|
28
|
-
const summaries = await Promise.all(names.map(name => this.summarize(name)));
|
|
32
|
+
const summaries = await Promise.all(names.map((name) => this.summarize(name, region)));
|
|
29
33
|
return summaries.filter((s) => s !== null);
|
|
30
34
|
}
|
|
31
|
-
async summarize(name) {
|
|
35
|
+
async summarize(name, region) {
|
|
32
36
|
try {
|
|
37
|
+
const client = this.clientFor(region);
|
|
33
38
|
const [desc, ttl] = await Promise.all([
|
|
34
|
-
|
|
35
|
-
this.describeTtl(name),
|
|
39
|
+
client.send(new DescribeTableCommand({ TableName: name })),
|
|
40
|
+
this.describeTtl(name, region),
|
|
36
41
|
]);
|
|
37
42
|
const table = desc.Table;
|
|
38
43
|
if (!table)
|
|
@@ -62,11 +67,12 @@ export class DynamoExplorer {
|
|
|
62
67
|
return null;
|
|
63
68
|
}
|
|
64
69
|
}
|
|
65
|
-
async describeTable(name) {
|
|
66
|
-
const summary = await this.summarize(name);
|
|
70
|
+
async describeTable(name, region) {
|
|
71
|
+
const summary = await this.summarize(name, region);
|
|
67
72
|
if (!summary)
|
|
68
73
|
return null;
|
|
69
|
-
const
|
|
74
|
+
const client = this.clientFor(region);
|
|
75
|
+
const desc = await client.send(new DescribeTableCommand({ TableName: name }));
|
|
70
76
|
const table = desc.Table;
|
|
71
77
|
return {
|
|
72
78
|
...summary,
|
|
@@ -77,9 +83,10 @@ export class DynamoExplorer {
|
|
|
77
83
|
streamViewType: table.StreamSpecification?.StreamViewType,
|
|
78
84
|
};
|
|
79
85
|
}
|
|
80
|
-
async describeTtl(name) {
|
|
86
|
+
async describeTtl(name, region) {
|
|
81
87
|
try {
|
|
82
|
-
const
|
|
88
|
+
const client = this.clientFor(region);
|
|
89
|
+
const res = await client.send(new DescribeTimeToLiveCommand({ TableName: name }));
|
|
83
90
|
const desc = res.TimeToLiveDescription;
|
|
84
91
|
const status = desc?.TimeToLiveStatus;
|
|
85
92
|
const enabled = status === 'ENABLED' || status === 'ENABLING';
|
|
@@ -89,25 +96,27 @@ export class DynamoExplorer {
|
|
|
89
96
|
return { enabled: false };
|
|
90
97
|
}
|
|
91
98
|
}
|
|
92
|
-
async setTtl(name, enabled, attributeName) {
|
|
99
|
+
async setTtl(name, enabled, attributeName, region) {
|
|
93
100
|
if (enabled && !attributeName) {
|
|
94
101
|
throw new Error('attributeName is required when enabling TTL');
|
|
95
102
|
}
|
|
96
|
-
const current = await this.describeTtl(name);
|
|
103
|
+
const current = await this.describeTtl(name, region);
|
|
97
104
|
// UpdateTimeToLive requires the attribute name even when disabling — pass the current one.
|
|
98
105
|
const attr = enabled ? attributeName : current.attributeName ?? attributeName ?? 'ttl';
|
|
99
|
-
|
|
106
|
+
const client = this.clientFor(region);
|
|
107
|
+
await client.send(new UpdateTimeToLiveCommand({
|
|
100
108
|
TableName: name,
|
|
101
109
|
TimeToLiveSpecification: { Enabled: enabled, AttributeName: attr },
|
|
102
110
|
}));
|
|
103
111
|
return { enabled, attributeName: attr };
|
|
104
112
|
}
|
|
105
|
-
async scan(name, input) {
|
|
113
|
+
async scan(name, input, region) {
|
|
106
114
|
const eav = this.marshallExpressionValues(input.expressionAttributeValues);
|
|
107
115
|
const esk = input.exclusiveStartKey
|
|
108
116
|
? marshall(input.exclusiveStartKey, { removeUndefinedValues: true })
|
|
109
117
|
: undefined;
|
|
110
|
-
const
|
|
118
|
+
const client = this.clientFor(region);
|
|
119
|
+
const res = await client.send(new ScanCommand({
|
|
111
120
|
TableName: name,
|
|
112
121
|
FilterExpression: input.filterExpression || undefined,
|
|
113
122
|
ProjectionExpression: input.projectionExpression || undefined,
|
|
@@ -119,7 +128,7 @@ export class DynamoExplorer {
|
|
|
119
128
|
}));
|
|
120
129
|
return this.formatPagedOutput(res);
|
|
121
130
|
}
|
|
122
|
-
async query(name, input) {
|
|
131
|
+
async query(name, input, region) {
|
|
123
132
|
if (!input.keyConditionExpression) {
|
|
124
133
|
throw new Error('keyConditionExpression is required for query');
|
|
125
134
|
}
|
|
@@ -127,7 +136,8 @@ export class DynamoExplorer {
|
|
|
127
136
|
const esk = input.exclusiveStartKey
|
|
128
137
|
? marshall(input.exclusiveStartKey, { removeUndefinedValues: true })
|
|
129
138
|
: undefined;
|
|
130
|
-
const
|
|
139
|
+
const client = this.clientFor(region);
|
|
140
|
+
const res = await client.send(new QueryCommand({
|
|
131
141
|
TableName: name,
|
|
132
142
|
KeyConditionExpression: input.keyConditionExpression,
|
|
133
143
|
FilterExpression: input.filterExpression || undefined,
|
|
@@ -141,18 +151,20 @@ export class DynamoExplorer {
|
|
|
141
151
|
}));
|
|
142
152
|
return this.formatPagedOutput(res);
|
|
143
153
|
}
|
|
144
|
-
async getItem(name, key) {
|
|
145
|
-
const
|
|
154
|
+
async getItem(name, key, region) {
|
|
155
|
+
const client = this.clientFor(region);
|
|
156
|
+
const res = await client.send(new GetItemCommand({
|
|
146
157
|
TableName: name,
|
|
147
158
|
Key: marshall(key, { removeUndefinedValues: true }),
|
|
148
159
|
}));
|
|
149
160
|
return res.Item ? unmarshall(res.Item) : null;
|
|
150
161
|
}
|
|
151
|
-
async putItem(name, item) {
|
|
162
|
+
async putItem(name, item, region) {
|
|
152
163
|
if (!item || typeof item !== 'object') {
|
|
153
164
|
throw new Error('Item must be a plain object');
|
|
154
165
|
}
|
|
155
|
-
|
|
166
|
+
const client = this.clientFor(region);
|
|
167
|
+
await client.send(new PutItemCommand({
|
|
156
168
|
TableName: name,
|
|
157
169
|
Item: marshall(item, {
|
|
158
170
|
removeUndefinedValues: true,
|
|
@@ -160,8 +172,9 @@ export class DynamoExplorer {
|
|
|
160
172
|
}),
|
|
161
173
|
}));
|
|
162
174
|
}
|
|
163
|
-
async deleteItem(name, key) {
|
|
164
|
-
|
|
175
|
+
async deleteItem(name, key, region) {
|
|
176
|
+
const client = this.clientFor(region);
|
|
177
|
+
await client.send(new DeleteItemCommand({
|
|
165
178
|
TableName: name,
|
|
166
179
|
Key: marshall(key, { removeUndefinedValues: true }),
|
|
167
180
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamo-explorer.js","sourceRoot":"","sources":["../../../src/server/services/dynamo-explorer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACvB,WAAW,EACX,YAAY,EACZ,cAAc,EACd,cAAc,EACd,iBAAiB,GAMlB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAkD5D,MAAM,OAAO,cAAc;IACjB,MAAM,CAAC,QAAQ,CAAiB;IAChC,
|
|
1
|
+
{"version":3,"file":"dynamo-explorer.js","sourceRoot":"","sources":["../../../src/server/services/dynamo-explorer.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,7 +23,7 @@ export declare class ResourceProvisioner {
|
|
|
23
23
|
private resolveLambdaFunctionName;
|
|
24
24
|
private convertCamelCaseToKebab;
|
|
25
25
|
private resolveEventSourceArn;
|
|
26
|
-
listAllResources(): Promise<{
|
|
26
|
+
listAllResources(region?: string): Promise<{
|
|
27
27
|
tables: string[];
|
|
28
28
|
queues: string[];
|
|
29
29
|
topics: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-provisioner.d.ts","sourceRoot":"","sources":["../../../src/server/services/resource-provisioner.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,QAAQ,EAKT,MAAM,4BAA4B,CAAC;AAGpC,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAsB;IAC7C,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,aAAa,CAAuB;IAE5C,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,mBAAmB;IAOzC,OAAO,CAAC,iBAAiB;IAYnB,kBAAkB,CACtB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,QAAQ,EAAE,EACrB,QAAQ,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GACtE,OAAO,CAAC,IAAI,CAAC;YAyDF,mBAAmB;YA2DnB,cAAc;YAiCd,cAAc;IAiB5B,OAAO,CAAC,uBAAuB;YAoEjB,wBAAwB;YA0CxB,uBAAuB;IA+CrC,OAAO,CAAC,yBAAyB;IAoBjC,OAAO,CAAC,uBAAuB;YAOjB,qBAAqB;IAqE7B,gBAAgB,
|
|
1
|
+
{"version":3,"file":"resource-provisioner.d.ts","sourceRoot":"","sources":["../../../src/server/services/resource-provisioner.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,QAAQ,EAKT,MAAM,4BAA4B,CAAC;AAGpC,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAsB;IAC7C,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,aAAa,CAAuB;IAE5C,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,mBAAmB;IAOzC,OAAO,CAAC,iBAAiB;IAYnB,kBAAkB,CACtB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,QAAQ,EAAE,EACrB,QAAQ,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GACtE,OAAO,CAAC,IAAI,CAAC;YAyDF,mBAAmB;YA2DnB,cAAc;YAiCd,cAAc;IAiB5B,OAAO,CAAC,uBAAuB;YAoEjB,wBAAwB;YA0CxB,uBAAuB;IA+CrC,OAAO,CAAC,yBAAyB;IAoBjC,OAAO,CAAC,uBAAuB;YAOjB,qBAAqB;IAqE7B,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAC/C,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;YAgBY,kBAAkB;YASlB,aAAa;YASb,aAAa;IAYrB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAqCnE,mBAAmB;YAYnB,cAAc;YAiBd,cAAc;YAkBd,wBAAwB;CA6BvC"}
|
|
@@ -129,7 +129,7 @@ export class ResourceProvisioner {
|
|
|
129
129
|
: undefined,
|
|
130
130
|
}));
|
|
131
131
|
console.log(` ✓ Created DynamoDB table: ${resource.name}`);
|
|
132
|
-
SeedManager.getInstance().seedOnTableCreated(resource.name);
|
|
132
|
+
SeedManager.getInstance().seedOnTableCreated(resource.name, this.currentRegion);
|
|
133
133
|
}
|
|
134
134
|
catch (error) {
|
|
135
135
|
const errorName = error instanceof Error && 'name' in error ? error.name : '';
|
|
@@ -407,35 +407,40 @@ export const handler = async (event, context) => {
|
|
|
407
407
|
}
|
|
408
408
|
throw new Error(`Event source not found: ${arnRef} (resolved as: ${resourceName})`);
|
|
409
409
|
}
|
|
410
|
-
async listAllResources() {
|
|
410
|
+
async listAllResources(region) {
|
|
411
|
+
const baseConfig = LocalStackManager.getInstance().getConfig();
|
|
412
|
+
const config = region ? { ...baseConfig, region } : { ...baseConfig, region: this.currentRegion };
|
|
413
|
+
const dynamo = region && region !== this.currentRegion ? new DynamoDBClient(config) : this.dynamoClient;
|
|
414
|
+
const sqs = region && region !== this.currentRegion ? new SQSClient(config) : this.sqsClient;
|
|
415
|
+
const sns = region && region !== this.currentRegion ? new SNSClient(config) : this.snsClient;
|
|
411
416
|
const [tables, queues, topics] = await Promise.all([
|
|
412
|
-
this.listDynamoDBTables(),
|
|
413
|
-
this.listSQSQueues(),
|
|
414
|
-
this.listSNSTopics(),
|
|
417
|
+
this.listDynamoDBTables(dynamo),
|
|
418
|
+
this.listSQSQueues(sqs),
|
|
419
|
+
this.listSNSTopics(sns),
|
|
415
420
|
]);
|
|
416
421
|
return { tables, queues, topics };
|
|
417
422
|
}
|
|
418
|
-
async listDynamoDBTables() {
|
|
423
|
+
async listDynamoDBTables(client = this.dynamoClient) {
|
|
419
424
|
try {
|
|
420
|
-
const response = await
|
|
425
|
+
const response = await client.send(new ListTablesCommand({}));
|
|
421
426
|
return response.TableNames || [];
|
|
422
427
|
}
|
|
423
428
|
catch {
|
|
424
429
|
return [];
|
|
425
430
|
}
|
|
426
431
|
}
|
|
427
|
-
async listSQSQueues() {
|
|
432
|
+
async listSQSQueues(client = this.sqsClient) {
|
|
428
433
|
try {
|
|
429
|
-
const response = await
|
|
434
|
+
const response = await client.send(new ListQueuesCommand({}));
|
|
430
435
|
return response.QueueUrls?.map(url => url.split('/').pop()) || [];
|
|
431
436
|
}
|
|
432
437
|
catch {
|
|
433
438
|
return [];
|
|
434
439
|
}
|
|
435
440
|
}
|
|
436
|
-
async listSNSTopics() {
|
|
441
|
+
async listSNSTopics(client = this.snsClient) {
|
|
437
442
|
try {
|
|
438
|
-
const response = await
|
|
443
|
+
const response = await client.send(new ListTopicsCommand({}));
|
|
439
444
|
return response.Topics?.map(t => {
|
|
440
445
|
const arn = t.TopicArn?.split(':').pop();
|
|
441
446
|
return arn || '';
|