local-serverless-stack 0.0.8 → 0.0.11
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 +22 -0
- package/bin/cli.js +109 -5
- package/dist/server/index.js +4 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/routes/dynamo.d.ts +3 -0
- package/dist/server/routes/dynamo.d.ts.map +1 -0
- package/dist/server/routes/dynamo.js +135 -0
- package/dist/server/routes/dynamo.js.map +1 -0
- package/dist/server/routes/seeds.d.ts +3 -0
- package/dist/server/routes/seeds.d.ts.map +1 -0
- package/dist/server/routes/seeds.js +59 -0
- package/dist/server/routes/seeds.js.map +1 -0
- package/dist/server/services/config-manager.d.ts +2 -0
- package/dist/server/services/config-manager.d.ts.map +1 -1
- package/dist/server/services/config-manager.js +8 -0
- package/dist/server/services/config-manager.js.map +1 -1
- package/dist/server/services/dynamo-explorer.d.ts +66 -0
- package/dist/server/services/dynamo-explorer.d.ts.map +1 -0
- package/dist/server/services/dynamo-explorer.js +189 -0
- package/dist/server/services/dynamo-explorer.js.map +1 -0
- package/dist/server/services/resource-provisioner.d.ts.map +1 -1
- package/dist/server/services/resource-provisioner.js +3 -0
- package/dist/server/services/resource-provisioner.js.map +1 -1
- package/dist/server/services/seed-manager.d.ts +45 -0
- package/dist/server/services/seed-manager.d.ts.map +1 -0
- package/dist/server/services/seed-manager.js +239 -0
- package/dist/server/services/seed-manager.js.map +1 -0
- package/dist/ui/assets/index-BNgGSqP5.js +30 -0
- package/dist/ui/index.html +1 -1
- package/package.json +2 -1
- package/dist/ui/assets/index-CAkRQrHQ.js +0 -28
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,28 @@ 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.11] - 2026-05-18
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **DynamoDB explorer**: new "DynamoDB" tab inspired by the AWS Console. Lists every table with key schema, item count, billing mode, TTL/Streams status and per-table warnings (e.g. "TTL not configured"). Clicking a table opens a detail view with three sub-tabs.
|
|
12
|
+
- **Explore items (Scan / Query)**: visual filter builder with attribute / operator / value rows (operators: `=`, `<>`, `<`, `<=`, `>`, `>=`, `begins_with`, `contains`, `attribute_exists`, `attribute_not_exists`). Values are auto-typed (number/boolean/null/JSON). Supports running on the table or any GSI/LSI, configurable limit, and "Load more" pagination via `LastEvaluatedKey`. Query mode requires key conditions (up to PK + SK) and reuses the same builder.
|
|
13
|
+
- **Item CRUD**: per-row "View", "Edit" and "Delete" actions, plus a "Create item" button. Items are edited as plain JSON in a modal with format/validate. Edit performs a `PutItem` (full-replace); if any key attribute changed during edit, the original row is deleted first so it behaves like an update instead of producing a duplicate.
|
|
14
|
+
- **Indexes sub-tab**: lists GSIs and LSIs with their key schema, projection type, item count and status.
|
|
15
|
+
- **Settings sub-tab**: TTL toggle (`UpdateTimeToLive`), Streams view, table identifier (ARN + creation date), item count and size.
|
|
16
|
+
- **`/api/dynamo` endpoints**: `GET /tables`, `GET /tables/:name`, `GET/PUT /tables/:name/ttl`, `POST /tables/:name/scan`, `POST /tables/:name/query`, `POST /tables/:name/items` (PutItem), `POST /tables/:name/items/get` (GetItem), `POST /tables/:name/items/delete`. Items and keys cross the wire as plain JSON — the server `marshall`s/`unmarshall`s.
|
|
17
|
+
|
|
18
|
+
## [0.0.10] - 2026-05-18
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
- **DynamoDB seeding**: drop `{tableName}.json` files into the directory configured by the new `seedsDir` option (default `./seeds`) and items get marshalled and inserted into the matching DynamoDB table. Items are written as plain JSON (no AWS attribute-typed envelope) — `@aws-sdk/util-dynamodb`'s `marshall` infers types automatically.
|
|
22
|
+
- **Auto-seed on table creation**: when `ResourceProvisioner` creates a DynamoDB table, the `SeedManager` checks for a matching seed file and applies it in the background. Idempotent — re-runs are a `PutItem` merge by primary key. Failures are logged and never break the provisioner.
|
|
23
|
+
- **`/api/seeds` endpoints**: `GET /api/seeds` (list seed files + whether each target table exists), `POST /api/seeds/run` (apply one or all), `POST /api/seeds/clear` (delete every item from one table or from all tables that have a seed file).
|
|
24
|
+
- **CLI commands**: `npx lss seed [tableName]` and `npx lss seed:clear [tableName]`. With no argument they operate on every table that has a corresponding seed file.
|
|
25
|
+
- **Seeds dashboard tab**: new "Seeds" tab listing each seed file with its item count and whether the target table exists in LocalStack, plus per-row "Apply"/"Clear" buttons and global "Re-apply all"/"Clear all" actions.
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
- `ConfigManager` accepts the new `seedsDir` option (and `LSS_SEEDS_DIR` env var). Relative paths are resolved against the current working directory. Surfaced in the startup summary.
|
|
29
|
+
|
|
8
30
|
## [0.0.8] - 2026-05-18
|
|
9
31
|
|
|
10
32
|
### Added
|
package/bin/cli.js
CHANGED
|
@@ -235,6 +235,97 @@ function showStatus() {
|
|
|
235
235
|
}
|
|
236
236
|
}
|
|
237
237
|
|
|
238
|
+
function getServerPort() {
|
|
239
|
+
const cfg = getConfig(loadConfig());
|
|
240
|
+
return cfg.serverPort;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function postJson(path, body) {
|
|
244
|
+
return new Promise((resolve, reject) => {
|
|
245
|
+
const http = require('http');
|
|
246
|
+
const payload = JSON.stringify(body || {});
|
|
247
|
+
const req = http.request(
|
|
248
|
+
{
|
|
249
|
+
hostname: 'localhost',
|
|
250
|
+
port: getServerPort(),
|
|
251
|
+
path,
|
|
252
|
+
method: 'POST',
|
|
253
|
+
headers: {
|
|
254
|
+
'Content-Type': 'application/json',
|
|
255
|
+
'Content-Length': Buffer.byteLength(payload),
|
|
256
|
+
},
|
|
257
|
+
},
|
|
258
|
+
res => {
|
|
259
|
+
let data = '';
|
|
260
|
+
res.on('data', chunk => (data += chunk));
|
|
261
|
+
res.on('end', () => {
|
|
262
|
+
let parsed;
|
|
263
|
+
try { parsed = data ? JSON.parse(data) : {}; } catch { parsed = { raw: data }; }
|
|
264
|
+
if (res.statusCode >= 200 && res.statusCode < 300) {
|
|
265
|
+
resolve(parsed);
|
|
266
|
+
} else {
|
|
267
|
+
reject(new Error(parsed.error || `HTTP ${res.statusCode}`));
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
},
|
|
271
|
+
);
|
|
272
|
+
req.on('error', reject);
|
|
273
|
+
req.write(payload);
|
|
274
|
+
req.end();
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
function ensureRunningOrExit() {
|
|
279
|
+
if (!fs.existsSync(PID_FILE)) {
|
|
280
|
+
console.error('❌ LSS Orchestrator is not running. Start it with: npx lss start');
|
|
281
|
+
process.exit(1);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
function printSeedRunResults(results) {
|
|
286
|
+
for (const r of results) {
|
|
287
|
+
if (r.skipped) {
|
|
288
|
+
console.log(` ⚠ ${r.tableName}: skipped (${r.reason})`);
|
|
289
|
+
} else {
|
|
290
|
+
console.log(` ✓ ${r.tableName}: ${r.inserted} item(s) inserted`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
function printSeedClearResults(results) {
|
|
296
|
+
for (const r of results) {
|
|
297
|
+
if (r.skipped) {
|
|
298
|
+
console.log(` ⚠ ${r.tableName}: skipped (${r.reason})`);
|
|
299
|
+
} else {
|
|
300
|
+
console.log(` ✓ ${r.tableName}: ${r.deleted} item(s) deleted`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
async function runSeed(tableName) {
|
|
306
|
+
ensureRunningOrExit();
|
|
307
|
+
try {
|
|
308
|
+
console.log(tableName ? `🌱 Seeding ${tableName}...` : '🌱 Seeding all tables with seed files...');
|
|
309
|
+
const res = await postJson('/api/seeds/run', tableName ? { tableName } : {});
|
|
310
|
+
printSeedRunResults(res.results || []);
|
|
311
|
+
} catch (e) {
|
|
312
|
+
console.error('❌ Seed failed:', e.message);
|
|
313
|
+
process.exit(1);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
async function clearSeed(tableName) {
|
|
318
|
+
ensureRunningOrExit();
|
|
319
|
+
try {
|
|
320
|
+
console.log(tableName ? `🧹 Clearing ${tableName}...` : '🧹 Clearing all seeded tables...');
|
|
321
|
+
const res = await postJson('/api/seeds/clear', tableName ? { tableName } : {});
|
|
322
|
+
printSeedClearResults(res.results || []);
|
|
323
|
+
} catch (e) {
|
|
324
|
+
console.error('❌ Clear failed:', e.message);
|
|
325
|
+
process.exit(1);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
238
329
|
function showHelp() {
|
|
239
330
|
console.log(`
|
|
240
331
|
Local Serverless Stack (LSS) CLI
|
|
@@ -242,11 +333,15 @@ Local Serverless Stack (LSS) CLI
|
|
|
242
333
|
Usage: npx lss <command> [options]
|
|
243
334
|
|
|
244
335
|
Commands:
|
|
245
|
-
start
|
|
246
|
-
stop
|
|
247
|
-
status
|
|
248
|
-
logs
|
|
249
|
-
|
|
336
|
+
start Start the LSS Orchestrator in background
|
|
337
|
+
stop Stop the LSS Orchestrator
|
|
338
|
+
status Check if the orchestrator is running
|
|
339
|
+
logs Show the logs
|
|
340
|
+
seed [table] Apply seed file(s) from seedsDir into DynamoDB
|
|
341
|
+
(no args = all matching tables)
|
|
342
|
+
seed:clear [table] Delete all items from the given table (or all
|
|
343
|
+
tables with a seed file when no arg is given)
|
|
344
|
+
help Show this help message
|
|
250
345
|
|
|
251
346
|
Options:
|
|
252
347
|
--enable-dynamo-proxy Enable DynamoDB proxy on port 8000 (for start command)
|
|
@@ -290,6 +385,9 @@ Examples:
|
|
|
290
385
|
npx lss stop # Stop the orchestrator
|
|
291
386
|
npx lss status # Check status
|
|
292
387
|
npx lss logs # View logs
|
|
388
|
+
npx lss seed # Seed every table that has a {name}.json file
|
|
389
|
+
npx lss seed users # Seed only the "users" table
|
|
390
|
+
npx lss seed:clear users # Delete all items from "users"
|
|
293
391
|
`);
|
|
294
392
|
}
|
|
295
393
|
|
|
@@ -322,6 +420,12 @@ switch (command) {
|
|
|
322
420
|
case 'logs':
|
|
323
421
|
showLogs();
|
|
324
422
|
break;
|
|
423
|
+
case 'seed':
|
|
424
|
+
runSeed(process.argv[3]);
|
|
425
|
+
break;
|
|
426
|
+
case 'seed:clear':
|
|
427
|
+
clearSeed(process.argv[3]);
|
|
428
|
+
break;
|
|
325
429
|
case 'help':
|
|
326
430
|
case '--help':
|
|
327
431
|
case '-h':
|
package/dist/server/index.js
CHANGED
|
@@ -5,6 +5,8 @@ import { fileURLToPath } from 'url';
|
|
|
5
5
|
import { servicesRouter, processManager } from './routes/services.js';
|
|
6
6
|
import { resourcesRouter } from './routes/resources.js';
|
|
7
7
|
import { queuesRouter } from './routes/queues.js';
|
|
8
|
+
import { seedsRouter } from './routes/seeds.js';
|
|
9
|
+
import { dynamoRouter } from './routes/dynamo.js';
|
|
8
10
|
import { LocalStackManager } from './services/localstack-manager.js';
|
|
9
11
|
import { ConfigManager } from './services/config-manager.js';
|
|
10
12
|
import { QueueInspector } from './services/queue-inspector.js';
|
|
@@ -21,6 +23,8 @@ app.use(express.json());
|
|
|
21
23
|
app.use('/api/services', servicesRouter);
|
|
22
24
|
app.use('/api/resources', resourcesRouter);
|
|
23
25
|
app.use('/api/queues', queuesRouter);
|
|
26
|
+
app.use('/api/seeds', seedsRouter);
|
|
27
|
+
app.use('/api/dynamo', dynamoRouter);
|
|
24
28
|
// Health check
|
|
25
29
|
app.get('/api/health', (_req, res) => {
|
|
26
30
|
res.json({
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamo.d.ts","sourceRoot":"","sources":["../../../src/server/routes/dynamo.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,MAAM,4CAAW,CAAC;AA6HxB,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import { DynamoExplorer } from '../services/dynamo-explorer.js';
|
|
3
|
+
const router = Router();
|
|
4
|
+
const explorer = DynamoExplorer.getInstance();
|
|
5
|
+
function isValidName(name) {
|
|
6
|
+
return (typeof name === 'string' &&
|
|
7
|
+
name.length > 0 &&
|
|
8
|
+
name.length <= 255 &&
|
|
9
|
+
!name.includes('/') &&
|
|
10
|
+
!name.includes('..') &&
|
|
11
|
+
!name.includes('\\'));
|
|
12
|
+
}
|
|
13
|
+
function fail(res, error, status = 500) {
|
|
14
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
15
|
+
return res.status(status).json({ error: message });
|
|
16
|
+
}
|
|
17
|
+
router.get('/tables', async (_req, res) => {
|
|
18
|
+
try {
|
|
19
|
+
const tables = await explorer.listTables();
|
|
20
|
+
res.json({ tables });
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
fail(res, error);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
router.get('/tables/:name', async (req, res) => {
|
|
27
|
+
const { name } = req.params;
|
|
28
|
+
if (!isValidName(name))
|
|
29
|
+
return fail(res, new Error('Invalid table name'), 400);
|
|
30
|
+
try {
|
|
31
|
+
const detail = await explorer.describeTable(name);
|
|
32
|
+
if (!detail)
|
|
33
|
+
return res.status(404).json({ error: 'Table not found' });
|
|
34
|
+
return res.json(detail);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
return fail(res, error);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
router.get('/tables/:name/ttl', async (req, res) => {
|
|
41
|
+
const { name } = req.params;
|
|
42
|
+
if (!isValidName(name))
|
|
43
|
+
return fail(res, new Error('Invalid table name'), 400);
|
|
44
|
+
try {
|
|
45
|
+
return res.json(await explorer.describeTtl(name));
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return fail(res, error);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
router.put('/tables/:name/ttl', async (req, res) => {
|
|
52
|
+
const { name } = req.params;
|
|
53
|
+
if (!isValidName(name))
|
|
54
|
+
return fail(res, new Error('Invalid table name'), 400);
|
|
55
|
+
const { enabled, attributeName } = req.body ?? {};
|
|
56
|
+
if (typeof enabled !== 'boolean') {
|
|
57
|
+
return fail(res, new Error('enabled (boolean) is required'), 400);
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
return res.json(await explorer.setTtl(name, enabled, attributeName));
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
return fail(res, error, 400);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
router.post('/tables/:name/scan', async (req, res) => {
|
|
67
|
+
const { name } = req.params;
|
|
68
|
+
if (!isValidName(name))
|
|
69
|
+
return fail(res, new Error('Invalid table name'), 400);
|
|
70
|
+
try {
|
|
71
|
+
return res.json(await explorer.scan(name, req.body ?? {}));
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
return fail(res, error, 400);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
router.post('/tables/:name/query', async (req, res) => {
|
|
78
|
+
const { name } = req.params;
|
|
79
|
+
if (!isValidName(name))
|
|
80
|
+
return fail(res, new Error('Invalid table name'), 400);
|
|
81
|
+
try {
|
|
82
|
+
return res.json(await explorer.query(name, req.body ?? {}));
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
return fail(res, error, 400);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
router.post('/tables/:name/items/get', async (req, res) => {
|
|
89
|
+
const { name } = req.params;
|
|
90
|
+
if (!isValidName(name))
|
|
91
|
+
return fail(res, new Error('Invalid table name'), 400);
|
|
92
|
+
const { key } = req.body ?? {};
|
|
93
|
+
if (!key || typeof key !== 'object')
|
|
94
|
+
return fail(res, new Error('key is required'), 400);
|
|
95
|
+
try {
|
|
96
|
+
const item = await explorer.getItem(name, key);
|
|
97
|
+
return res.json({ item });
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
return fail(res, error);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
router.post('/tables/:name/items', async (req, res) => {
|
|
104
|
+
const { name } = req.params;
|
|
105
|
+
if (!isValidName(name))
|
|
106
|
+
return fail(res, new Error('Invalid table name'), 400);
|
|
107
|
+
const { item } = req.body ?? {};
|
|
108
|
+
if (!item || typeof item !== 'object' || Array.isArray(item)) {
|
|
109
|
+
return fail(res, new Error('item must be a plain object'), 400);
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
await explorer.putItem(name, item);
|
|
113
|
+
return res.json({ success: true });
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
return fail(res, error, 400);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
router.post('/tables/:name/items/delete', async (req, res) => {
|
|
120
|
+
const { name } = req.params;
|
|
121
|
+
if (!isValidName(name))
|
|
122
|
+
return fail(res, new Error('Invalid table name'), 400);
|
|
123
|
+
const { key } = req.body ?? {};
|
|
124
|
+
if (!key || typeof key !== 'object')
|
|
125
|
+
return fail(res, new Error('key is required'), 400);
|
|
126
|
+
try {
|
|
127
|
+
await explorer.deleteItem(name, key);
|
|
128
|
+
return res.json({ success: true });
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
return fail(res, error, 400);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
export { router as dynamoRouter };
|
|
135
|
+
//# sourceMappingURL=dynamo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamo.js","sourceRoot":"","sources":["../../../src/server/routes/dynamo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seeds.d.ts","sourceRoot":"","sources":["../../../src/server/routes/seeds.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AA0DxB,OAAO,EAAE,MAAM,IAAI,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import { SeedManager } from '../services/seed-manager.js';
|
|
3
|
+
import { ConfigManager } from '../services/config-manager.js';
|
|
4
|
+
const router = Router();
|
|
5
|
+
const seeds = SeedManager.getInstance();
|
|
6
|
+
function isValidTableName(name) {
|
|
7
|
+
return (typeof name === 'string' &&
|
|
8
|
+
name.length > 0 &&
|
|
9
|
+
!name.includes('/') &&
|
|
10
|
+
!name.includes('..') &&
|
|
11
|
+
!name.includes('\\'));
|
|
12
|
+
}
|
|
13
|
+
router.get('/', async (_req, res) => {
|
|
14
|
+
try {
|
|
15
|
+
const entries = await seeds.list();
|
|
16
|
+
res.json({
|
|
17
|
+
seedsDir: ConfigManager.getInstance().getSeedsDir(),
|
|
18
|
+
entries,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
const message = error instanceof Error ? error.message : 'Failed to list seeds';
|
|
23
|
+
res.status(500).json({ error: message });
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
router.post('/run', async (req, res) => {
|
|
27
|
+
try {
|
|
28
|
+
const { tableName } = req.body ?? {};
|
|
29
|
+
if (tableName !== undefined && !isValidTableName(tableName)) {
|
|
30
|
+
return res.status(400).json({ error: 'Invalid tableName' });
|
|
31
|
+
}
|
|
32
|
+
const result = tableName
|
|
33
|
+
? [await seeds.seedTable(tableName)]
|
|
34
|
+
: await seeds.seedAll();
|
|
35
|
+
return res.json({ results: result });
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
const message = error instanceof Error ? error.message : 'Failed to run seeds';
|
|
39
|
+
return res.status(500).json({ error: message });
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
router.post('/clear', async (req, res) => {
|
|
43
|
+
try {
|
|
44
|
+
const { tableName } = req.body ?? {};
|
|
45
|
+
if (tableName !== undefined && !isValidTableName(tableName)) {
|
|
46
|
+
return res.status(400).json({ error: 'Invalid tableName' });
|
|
47
|
+
}
|
|
48
|
+
const result = tableName
|
|
49
|
+
? [await seeds.clearTable(tableName)]
|
|
50
|
+
: await seeds.clearAllSeeded();
|
|
51
|
+
return res.json({ results: result });
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
const message = error instanceof Error ? error.message : 'Failed to clear seeds';
|
|
55
|
+
return res.status(500).json({ error: message });
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
export { router as seedsRouter };
|
|
59
|
+
//# sourceMappingURL=seeds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seeds.js","sourceRoot":"","sources":["../../../src/server/routes/seeds.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ export interface LSSConfig {
|
|
|
15
15
|
services?: string[];
|
|
16
16
|
persistence?: boolean;
|
|
17
17
|
debug?: boolean;
|
|
18
|
+
seedsDir?: string;
|
|
18
19
|
}
|
|
19
20
|
export declare class ConfigManager {
|
|
20
21
|
private static instance;
|
|
@@ -41,6 +42,7 @@ export declare class ConfigManager {
|
|
|
41
42
|
getServices(): string[];
|
|
42
43
|
isPersistence(): boolean;
|
|
43
44
|
isDebug(): boolean;
|
|
45
|
+
getSeedsDir(): string;
|
|
44
46
|
getConfigPath(): string;
|
|
45
47
|
/**
|
|
46
48
|
* Print configuration summary
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../../src/server/services/config-manager.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,CAAC;AACpD,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,KAAK,CAAC;AAEpD,MAAM,WAAW,SAAS;IAExB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAK5B,IAAI,CAAC,EAAE,cAAc,CAAC;IAGtB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAGtC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAG3B,eAAe,CAAC,EAAE,MAAM,CAAC;IAIzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAG7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAGpB,WAAW,CAAC,EAAE,OAAO,CAAC;IAGtB,KAAK,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../../src/server/services/config-manager.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,CAAC;AACpD,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,KAAK,CAAC;AAEpD,MAAM,WAAW,SAAS;IAExB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAK5B,IAAI,CAAC,EAAE,cAAc,CAAC;IAGtB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAGtC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAG3B,eAAe,CAAC,EAAE,MAAM,CAAC;IAIzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAG7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAGpB,WAAW,CAAC,EAAE,OAAO,CAAC;IAGtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAIhB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgB;IACvC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,UAAU,CAAc;IAEhC,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,aAAa;IAOnC,OAAO,CAAC,UAAU;IAiClB,OAAO,CAAC,WAAW;IAuDnB,SAAS,IAAI,SAAS;IAItB,aAAa,IAAI,MAAM;IAKvB,gBAAgB,IAAI,MAAM;IAI1B,iBAAiB,IAAI,MAAM;IAI3B,qBAAqB,IAAI,MAAM;IAQ/B,OAAO,IAAI,cAAc;IAIzB,UAAU,IAAI,OAAO;IAIrB,oBAAoB,IAAI,iBAAiB;IAIzC,oBAAoB,IAAI,MAAM;IAI9B,kBAAkB,IAAI,MAAM;IAQ5B,sBAAsB,IAAI,MAAM,GAAG,SAAS;IAI5C,mBAAmB,IAAI,OAAO;IAQ9B,kBAAkB,IAAI,MAAM;IAI5B,SAAS,IAAI,MAAM;IAInB,WAAW,IAAI,MAAM,EAAE;IAIvB,aAAa,IAAI,OAAO;IAOxB,OAAO,IAAI,OAAO;IAOlB,WAAW,IAAI,MAAM;IAKrB,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,YAAY,IAAI,IAAI;IAuBpB,kBAAkB,IAAI,MAAM;CAI7B"}
|
|
@@ -93,6 +93,9 @@ export class ConfigManager {
|
|
|
93
93
|
if (process.env.LSS_DEBUG) {
|
|
94
94
|
this.config.debug = process.env.LSS_DEBUG === 'true' || process.env.LSS_DEBUG === '1';
|
|
95
95
|
}
|
|
96
|
+
if (process.env.LSS_SEEDS_DIR) {
|
|
97
|
+
this.config.seedsDir = process.env.LSS_SEEDS_DIR;
|
|
98
|
+
}
|
|
96
99
|
}
|
|
97
100
|
getConfig() {
|
|
98
101
|
return this.config;
|
|
@@ -164,6 +167,10 @@ export class ConfigManager {
|
|
|
164
167
|
}
|
|
165
168
|
return false;
|
|
166
169
|
}
|
|
170
|
+
getSeedsDir() {
|
|
171
|
+
const raw = this.config.seedsDir ?? './seeds';
|
|
172
|
+
return path.isAbsolute(raw) ? raw : path.resolve(process.cwd(), raw);
|
|
173
|
+
}
|
|
167
174
|
getConfigPath() {
|
|
168
175
|
return this.configPath;
|
|
169
176
|
}
|
|
@@ -186,6 +193,7 @@ export class ConfigManager {
|
|
|
186
193
|
console.log(` AWS Region: ${this.getRegion()}`);
|
|
187
194
|
console.log(` Services: ${this.getServices().join(', ')}`);
|
|
188
195
|
console.log(` Persistence: ${this.isPersistence()}`);
|
|
196
|
+
console.log(` Seeds Dir: ${this.getSeedsDir()}`);
|
|
189
197
|
if (this.getConfigPath()) {
|
|
190
198
|
console.log(` Config File: ${this.getConfigPath()}`);
|
|
191
199
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/server/services/config-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/server/services/config-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { type KeySchemaElement, type AttributeDefinition, type GlobalSecondaryIndexDescription, type LocalSecondaryIndexDescription } from '@aws-sdk/client-dynamodb';
|
|
2
|
+
export interface TtlInfo {
|
|
3
|
+
enabled: boolean;
|
|
4
|
+
attributeName?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface DynamoTableSummary {
|
|
7
|
+
name: string;
|
|
8
|
+
status?: string;
|
|
9
|
+
itemCount: number;
|
|
10
|
+
sizeBytes: number;
|
|
11
|
+
keySchema: KeySchemaElement[];
|
|
12
|
+
attributeDefinitions: AttributeDefinition[];
|
|
13
|
+
hasGsi: boolean;
|
|
14
|
+
hasLsi: boolean;
|
|
15
|
+
streamEnabled: boolean;
|
|
16
|
+
ttl: TtlInfo;
|
|
17
|
+
billingMode?: string;
|
|
18
|
+
createdAt?: string;
|
|
19
|
+
warnings: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface DynamoTableDetail extends DynamoTableSummary {
|
|
22
|
+
arn?: string;
|
|
23
|
+
gsis: GlobalSecondaryIndexDescription[];
|
|
24
|
+
lsis: LocalSecondaryIndexDescription[];
|
|
25
|
+
streamArn?: string;
|
|
26
|
+
streamViewType?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface ScanQueryInput {
|
|
29
|
+
filterExpression?: string;
|
|
30
|
+
keyConditionExpression?: string;
|
|
31
|
+
projectionExpression?: string;
|
|
32
|
+
expressionAttributeNames?: Record<string, string>;
|
|
33
|
+
expressionAttributeValues?: Record<string, unknown>;
|
|
34
|
+
indexName?: string;
|
|
35
|
+
limit?: number;
|
|
36
|
+
exclusiveStartKey?: Record<string, unknown>;
|
|
37
|
+
scanIndexForward?: boolean;
|
|
38
|
+
}
|
|
39
|
+
export interface ScanQueryOutput {
|
|
40
|
+
items: Record<string, unknown>[];
|
|
41
|
+
count: number;
|
|
42
|
+
scannedCount?: number;
|
|
43
|
+
lastEvaluatedKey?: Record<string, unknown>;
|
|
44
|
+
}
|
|
45
|
+
export declare class DynamoExplorer {
|
|
46
|
+
private static instance;
|
|
47
|
+
private client;
|
|
48
|
+
private currentRegion;
|
|
49
|
+
private constructor();
|
|
50
|
+
static getInstance(): DynamoExplorer;
|
|
51
|
+
private init;
|
|
52
|
+
setRegion(region: string): void;
|
|
53
|
+
listTables(): Promise<DynamoTableSummary[]>;
|
|
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>): Promise<Record<string, unknown> | null>;
|
|
61
|
+
putItem(name: string, item: Record<string, unknown>): Promise<void>;
|
|
62
|
+
deleteItem(name: string, key: Record<string, unknown>): Promise<void>;
|
|
63
|
+
private marshallExpressionValues;
|
|
64
|
+
private formatPagedOutput;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=dynamo-explorer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamo-explorer.d.ts","sourceRoot":"","sources":["../../../src/server/services/dynamo-explorer.ts"],"names":[],"mappings":"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"}
|