local-serverless-stack 0.1.0 → 0.1.2
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 +23 -0
- package/bin/cli.js +199 -11
- package/dist/server/routes/seeds.d.ts.map +1 -1
- package/dist/server/routes/seeds.js +6 -1
- package/dist/server/routes/seeds.js.map +1 -1
- package/dist/server/services/seed-manager.d.ts +2 -0
- package/dist/server/services/seed-manager.d.ts.map +1 -1
- package/dist/server/services/seed-manager.js +40 -0
- package/dist/server/services/seed-manager.js.map +1 -1
- package/dist/ui/assets/{BucketDetailPage-DQU5IfHZ.js → BucketDetailPage-Hg4Gg3jC.js} +1 -1
- package/dist/ui/assets/{BucketsPage-FDb9r2GE.js → BucketsPage-BHkg7TQp.js} +1 -1
- package/dist/ui/assets/DynamoPage-CH_TgPh_.js +1 -0
- package/dist/ui/assets/{DynamoTablePage-D2-tvZSS.js → DynamoTablePage-BPvl5y6_.js} +1 -1
- package/dist/ui/assets/{OverviewPage-DKpsGNi-.js → OverviewPage-nhomNDqx.js} +1 -1
- package/dist/ui/assets/{QueueDetailPage-m_Ux1JRb.js → QueueDetailPage-DHDPgRDc.js} +1 -1
- package/dist/ui/assets/{QueuesPage-CEfnzK5n.js → QueuesPage-D5YcEbUU.js} +1 -1
- package/dist/ui/assets/{ServiceDetailPage-DMgYxag6.js → ServiceDetailPage-DxJ0t7HQ.js} +1 -1
- package/dist/ui/assets/{ServicesPage-Dl9Md68f.js → ServicesPage-DWDaaOz9.js} +1 -1
- package/dist/ui/assets/{index-xSUtPJWt.js → index-D3WwZ4lY.js} +2 -2
- package/dist/ui/index.html +1 -1
- package/package.json +1 -1
- package/dist/ui/assets/DynamoPage-D0Q2SOCV.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,29 @@ 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.1.2] - 2026-05-26
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **`npx lss seed:clear` now requires interactive confirmation**: before issuing any `DeleteRequest`, the CLI lists the exact LocalStack tables it would wipe, prints the LocalStack URL, makes the "this never touches AWS" guarantee explicit, and waits for the user to type `confirmar` (case-sensitive, exact match after trim). Anything else cancels with `🚫 Cancelado — nenhuma alteração feita.` and no clear call is made. `--yes` / `-y` skips the prompt for CI use.
|
|
12
|
+
- **Defensive endpoint guard in `SeedManager`**: `clearTable` and `clearAllSeeded` now refuse to run unless the resolved DynamoDB endpoint hostname is on a hardcoded local allowlist (`localhost`, `127.0.0.1`, `::1`, `0.0.0.0`, `host.docker.internal`, `localstack`, `lss-localstack`, `lss-localstack-<port>`, `*.localhost`). If a future refactor ever pointed `LocalStackManager.getConfig()` at a real AWS endpoint, the guard would throw `Refusing destructive operation: endpoint "..." is not a recognized local LocalStack host. seed:clear may ONLY run against LocalStack — never against AWS.` before any AWS SDK call. Architecture already pinned writes to LocalStack via fake credentials; this is belt-and-braces.
|
|
13
|
+
- **Seed/clear mismatch diagnostic**: `GET /api/seeds` now also returns `liveTables: string[]` (every DynamoDB table currently in LocalStack). When `npx lss seed` skips tables or `npx lss seed:clear` finds no live targets, the CLI prints a two-column diagnostic — seed files inspected on one side, live LocalStack tables on the other — with the hint "Os nomes dos arquivos de seed precisam bater EXATAMENTE com o `TableName` no CloudFormation." This makes seed-name/table-name typos obvious instead of "nothing happened, why?". When the live-tables list is empty, the CLI falls back to the older "run `npx lss start` + `npx serverless deploy` first" hint.
|
|
14
|
+
- **Test infrastructure**: new `tests/unit/seed-manager-guard.test.ts` (27 tests covering the endpoint allowlist matrix, IPv6 bracket handling, malformed URLs, and that `clearTable`/`clearAllSeeded` invoke the guard) and `tests/unit/cli-seed.test.ts` (21 tests spawning `bin/cli.js` against an in-process HTTP stub of the orchestrator — covers confirmation flow, `--yes`/`-y` bypass, "no live tables" diagnostic, name-mismatch diagnostic, and `formatError` robustness against 500-with-empty-body / 500-with-non-JSON / `{error: ""}` responses).
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
- **`bin/cli.js` error handling never leaves the user with an empty message**: new `formatError(e)` and `buildHttpError(res, data)` helpers walk a fallback chain (`e.message` → `e.code` → `e.name` → body snippet → HTTP status text → "erro desconhecido (sem detalhes)") so a response 500 with no body, a socket reset during orchestrator startup, or an `Error` with empty `.message` all produce a useful CLI line instead of `❌ Não consegui listar as tabelas antes de limpar:` with a blank suffix. Applied to every `console.error` path in `seed`, `seed:clear`, and the underlying `getJson`/`postJson` helpers.
|
|
18
|
+
- **`npx lss seed` hint when tables are missing in LocalStack**: previously printed a generic "tabelas foram puladas" footer. Now it fetches `liveTables` and shows the same mismatch diagnostic as `seed:clear`, so the user sees whether the cause is "I haven't deployed yet" (no live tables) or "my seed file name is wrong" (live tables exist but don't match).
|
|
19
|
+
- **`firstPositional()` arg parser in the CLI**: commands that accept an optional table name (`seed`, `seed:clear`) now skip args starting with `-`. Without this, `npx lss seed:clear --yes` was interpreting `--yes` as the table name.
|
|
20
|
+
- **`SeedManager.assertLocalEndpoint` normalizes IPv6 brackets** so URLs like `http://[::1]:4566` (which `new URL().hostname` reports as `[::1]`) match the `::1` entry in the allowlist instead of being rejected as non-local.
|
|
21
|
+
- **`jest.config.js` `moduleNameMapper`**: strips `.js` from relative imports during tests so the server's NodeNext-style ESM imports (`import { Foo } from './foo.js'`) resolve to TypeScript sources under ts-jest. Without this, no unit test could import from `src/server/`.
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
- **`examples/pro-sample-microservice/seeds/`**: renamed `sample-microservice-Users.json` → `pro-sample-microservice-Users.json` and `sample-microservice-Orders.json` → `pro-sample-microservice-Orders.json` (via `git mv` to preserve history). The files had been copied from `sample-microservice` but never renamed, so the seed prefix didn't match the example's actual `${self:service}-*` `TableName`s in `serverless.yml` — `npx lss seed` and `npx lss seed:clear` always found `tableExists: false` and silently did nothing.
|
|
25
|
+
|
|
26
|
+
## [0.1.1] - 2026-05-21
|
|
27
|
+
|
|
28
|
+
### Added
|
|
29
|
+
- **DynamoDB tables: search filter**: the DynamoDB tab now has a text input in the table-list header that filters rows by table name or owning service as you type, so finding a table no longer requires `Ctrl+F`. When a query matches nothing, an empty state shows the active query.
|
|
30
|
+
|
|
8
31
|
## [0.1.0] - 2026-05-21
|
|
9
32
|
|
|
10
33
|
### Added
|
package/bin/cli.js
CHANGED
|
@@ -263,6 +263,30 @@ function getServerPort() {
|
|
|
263
263
|
return cfg.serverPort;
|
|
264
264
|
}
|
|
265
265
|
|
|
266
|
+
// Produce a usable error string for the user. Errors from the http stack
|
|
267
|
+
// occasionally carry an empty `.message` (e.g. socket resets during the
|
|
268
|
+
// orchestrator startup window) — fall back through every signal we have so
|
|
269
|
+
// `formatError` is guaranteed not to return an empty string.
|
|
270
|
+
function formatError(e) {
|
|
271
|
+
if (!e) return 'erro desconhecido (sem detalhes)';
|
|
272
|
+
if (typeof e === 'string') return e.trim() || 'erro desconhecido (sem detalhes)';
|
|
273
|
+
if (e.message && String(e.message).trim()) return String(e.message).trim();
|
|
274
|
+
if (e.code) return `erro de I/O (${e.code})`;
|
|
275
|
+
if (e.name) return e.name;
|
|
276
|
+
const s = String(e);
|
|
277
|
+
return s && s !== '[object Object]' ? s : 'erro desconhecido (sem detalhes)';
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
function buildHttpError(res, data) {
|
|
281
|
+
let parsed;
|
|
282
|
+
try { parsed = data ? JSON.parse(data) : {}; } catch { parsed = null; }
|
|
283
|
+
const fromBody = parsed && (parsed.error || parsed.message);
|
|
284
|
+
if (fromBody && String(fromBody).trim()) return new Error(String(fromBody).trim());
|
|
285
|
+
const snippet = data && data.length < 300 ? data.trim() : '';
|
|
286
|
+
const statusText = res.statusMessage ? `${res.statusCode} ${res.statusMessage}` : `${res.statusCode}`;
|
|
287
|
+
return new Error(snippet ? `HTTP ${statusText}: ${snippet}` : `HTTP ${statusText} (sem corpo de erro)`);
|
|
288
|
+
}
|
|
289
|
+
|
|
266
290
|
function postJson(path, body) {
|
|
267
291
|
return new Promise((resolve, reject) => {
|
|
268
292
|
const http = require('http');
|
|
@@ -282,17 +306,17 @@ function postJson(path, body) {
|
|
|
282
306
|
let data = '';
|
|
283
307
|
res.on('data', chunk => (data += chunk));
|
|
284
308
|
res.on('end', () => {
|
|
285
|
-
let parsed;
|
|
286
|
-
try { parsed = data ? JSON.parse(data) : {}; } catch { parsed = { raw: data }; }
|
|
287
309
|
if (res.statusCode >= 200 && res.statusCode < 300) {
|
|
310
|
+
let parsed;
|
|
311
|
+
try { parsed = data ? JSON.parse(data) : {}; } catch { parsed = { raw: data }; }
|
|
288
312
|
resolve(parsed);
|
|
289
313
|
} else {
|
|
290
|
-
reject(
|
|
314
|
+
reject(buildHttpError(res, data));
|
|
291
315
|
}
|
|
292
316
|
});
|
|
293
317
|
},
|
|
294
318
|
);
|
|
295
|
-
req.on('error', reject);
|
|
319
|
+
req.on('error', err => reject(err && err.message ? err : new Error(`falha na conexão HTTP com o orchestrator: ${formatError(err)}`)));
|
|
296
320
|
req.write(payload);
|
|
297
321
|
req.end();
|
|
298
322
|
});
|
|
@@ -307,13 +331,53 @@ function ensureRunningOrExit() {
|
|
|
307
331
|
}
|
|
308
332
|
|
|
309
333
|
function printSeedRunResults(results) {
|
|
334
|
+
let missingTables = 0;
|
|
310
335
|
for (const r of results) {
|
|
311
336
|
if (r.skipped) {
|
|
312
337
|
console.log(` ⚠ ${r.tableName}: skipped (${r.reason})`);
|
|
338
|
+
if (r.reason && r.reason.includes('does not exist in LocalStack')) {
|
|
339
|
+
missingTables++;
|
|
340
|
+
}
|
|
313
341
|
} else {
|
|
314
342
|
console.log(` ✓ ${r.tableName}: ${r.inserted} item(s) inserted`);
|
|
315
343
|
}
|
|
316
344
|
}
|
|
345
|
+
return { missingTables };
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// Show the user both sides of the comparison: the seed files we found, and
|
|
349
|
+
// the DynamoDB tables actually living in LocalStack. This is the difference
|
|
350
|
+
// between "I didn't deploy yet" (no live tables at all) and "my seed file
|
|
351
|
+
// name doesn't match the CFN TableName" (live tables exist, just not those).
|
|
352
|
+
function printSeedMismatchDiagnostic({ entries, liveTables, focusTable }) {
|
|
353
|
+
const seedNames = entries.map(e => e.tableName);
|
|
354
|
+
const focusList = focusTable ? [focusTable] : seedNames;
|
|
355
|
+
|
|
356
|
+
console.log('');
|
|
357
|
+
if (focusTable) {
|
|
358
|
+
console.log(`📂 Arquivo de seed inspecionado: ${focusTable}.json`);
|
|
359
|
+
} else if (focusList.length > 0) {
|
|
360
|
+
console.log('📂 Arquivos de seed inspecionados (tabela esperada):');
|
|
361
|
+
for (const name of focusList) console.log(` - ${name}`);
|
|
362
|
+
} else {
|
|
363
|
+
console.log('📂 Nenhum arquivo *.json encontrado no seedsDir.');
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
if (liveTables && liveTables.length > 0) {
|
|
367
|
+
console.log('');
|
|
368
|
+
console.log(`🗂️ Tabelas vivas no LocalStack (${liveTables.length}):`);
|
|
369
|
+
for (const name of liveTables) console.log(` - ${name}`);
|
|
370
|
+
console.log('');
|
|
371
|
+
console.log('💡 Os nomes dos arquivos de seed precisam bater EXATAMENTE com o `TableName` no CloudFormation.');
|
|
372
|
+
console.log(' Confira se há prefixo/sufixo divergente entre o arquivo e a tabela.');
|
|
373
|
+
} else {
|
|
374
|
+
console.log('');
|
|
375
|
+
console.log('🗂️ Nenhuma tabela viva no LocalStack ainda.');
|
|
376
|
+
console.log('💡 Provavelmente o stack ainda não foi provisionado. Tente:');
|
|
377
|
+
console.log(' npx lss start # garante LocalStack rodando');
|
|
378
|
+
console.log(' npx serverless deploy # cria as tabelas');
|
|
379
|
+
console.log(' E rode `npx lss seed` novamente.');
|
|
380
|
+
}
|
|
317
381
|
}
|
|
318
382
|
|
|
319
383
|
function printSeedClearResults(results) {
|
|
@@ -331,21 +395,130 @@ async function runSeed(tableName) {
|
|
|
331
395
|
try {
|
|
332
396
|
console.log(tableName ? `🌱 Seeding ${tableName}...` : '🌱 Seeding all tables with seed files...');
|
|
333
397
|
const res = await postJson('/api/seeds/run', tableName ? { tableName } : {});
|
|
334
|
-
printSeedRunResults(res.results || []);
|
|
398
|
+
const { missingTables } = printSeedRunResults(res.results || []);
|
|
399
|
+
if (missingTables > 0) {
|
|
400
|
+
try {
|
|
401
|
+
const list = await getJson('/api/seeds');
|
|
402
|
+
printSeedMismatchDiagnostic({
|
|
403
|
+
entries: (list.entries || []).filter(e => !e.tableExists),
|
|
404
|
+
liveTables: list.liveTables || [],
|
|
405
|
+
focusTable: tableName,
|
|
406
|
+
});
|
|
407
|
+
} catch (diagErr) {
|
|
408
|
+
// Diagnostic is best-effort; don't fail the seed because the hint failed.
|
|
409
|
+
console.log(`(não consegui detalhar tabelas vivas: ${formatError(diagErr)})`);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
335
412
|
} catch (e) {
|
|
336
|
-
console.error('❌ Seed failed:', e
|
|
413
|
+
console.error('❌ Seed failed:', formatError(e));
|
|
337
414
|
process.exit(1);
|
|
338
415
|
}
|
|
339
416
|
}
|
|
340
417
|
|
|
418
|
+
function getJson(path) {
|
|
419
|
+
return new Promise((resolve, reject) => {
|
|
420
|
+
const http = require('http');
|
|
421
|
+
const req = http.request(
|
|
422
|
+
{
|
|
423
|
+
hostname: 'localhost',
|
|
424
|
+
port: getServerPort(),
|
|
425
|
+
path,
|
|
426
|
+
method: 'GET',
|
|
427
|
+
},
|
|
428
|
+
res => {
|
|
429
|
+
let data = '';
|
|
430
|
+
res.on('data', chunk => (data += chunk));
|
|
431
|
+
res.on('end', () => {
|
|
432
|
+
if (res.statusCode >= 200 && res.statusCode < 300) {
|
|
433
|
+
let parsed;
|
|
434
|
+
try { parsed = data ? JSON.parse(data) : {}; } catch { parsed = { raw: data }; }
|
|
435
|
+
resolve(parsed);
|
|
436
|
+
} else {
|
|
437
|
+
reject(buildHttpError(res, data));
|
|
438
|
+
}
|
|
439
|
+
});
|
|
440
|
+
},
|
|
441
|
+
);
|
|
442
|
+
req.on('error', err => reject(err && err.message ? err : new Error(`falha na conexão HTTP com o orchestrator: ${formatError(err)}`)));
|
|
443
|
+
req.end();
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
function promptConfirmation(expectedWord) {
|
|
448
|
+
return new Promise(resolve => {
|
|
449
|
+
const readline = require('readline');
|
|
450
|
+
const rl = readline.createInterface({
|
|
451
|
+
input: process.stdin,
|
|
452
|
+
output: process.stdout,
|
|
453
|
+
});
|
|
454
|
+
rl.question(`Digite "${expectedWord}" para prosseguir (ou qualquer outra coisa para cancelar): `, answer => {
|
|
455
|
+
rl.close();
|
|
456
|
+
resolve(answer.trim() === expectedWord);
|
|
457
|
+
});
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
|
|
341
461
|
async function clearSeed(tableName) {
|
|
342
462
|
ensureRunningOrExit();
|
|
463
|
+
|
|
464
|
+
const skipConfirm = process.argv.includes('--yes') || process.argv.includes('-y');
|
|
465
|
+
const cfg = getConfig(loadConfig());
|
|
466
|
+
|
|
467
|
+
// Show the user exactly what's about to be wiped before they confirm.
|
|
468
|
+
// Hitting the orchestrator's GET /api/seeds also implicitly proves we're
|
|
469
|
+
// talking to LocalStack and not AWS — the orchestrator only ever connects
|
|
470
|
+
// to the configured local LocalStack endpoint.
|
|
471
|
+
let scopeDescription;
|
|
472
|
+
try {
|
|
473
|
+
const list = await getJson('/api/seeds');
|
|
474
|
+
const entries = list.entries || [];
|
|
475
|
+
const liveTables = list.liveTables || [];
|
|
476
|
+
const targets = tableName ? entries.filter(e => e.tableName === tableName) : entries;
|
|
477
|
+
const liveTargets = targets.filter(e => e.tableExists);
|
|
478
|
+
|
|
479
|
+
if (liveTargets.length === 0) {
|
|
480
|
+
if (tableName) {
|
|
481
|
+
console.log(`⚠️ Nenhuma tabela "${tableName}" existente no LocalStack para limpar.`);
|
|
482
|
+
} else if (entries.length === 0) {
|
|
483
|
+
console.log('⚠️ Nenhum arquivo de seed (*.json) encontrado no seedsDir — nada para limpar.');
|
|
484
|
+
} else {
|
|
485
|
+
console.log(`⚠️ ${entries.length} arquivo(s) de seed encontrados, mas NENHUMA das tabelas correspondentes existe no LocalStack.`);
|
|
486
|
+
}
|
|
487
|
+
printSeedMismatchDiagnostic({ entries, liveTables, focusTable: tableName });
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
scopeDescription = tableName
|
|
492
|
+
? `a tabela "${tableName}"`
|
|
493
|
+
: `${liveTargets.length} tabela(s): ${liveTargets.map(e => e.tableName).join(', ')}`;
|
|
494
|
+
|
|
495
|
+
console.log('');
|
|
496
|
+
console.log('⚠️ ATENÇÃO: operação destrutiva');
|
|
497
|
+
console.log(` Alvo: ${scopeDescription}`);
|
|
498
|
+
console.log(` LocalStack: http://localhost:${cfg.localstackPort}`);
|
|
499
|
+
console.log(' Esta ação NÃO toca em nenhuma conta AWS — apenas o LocalStack acima.');
|
|
500
|
+
console.log('');
|
|
501
|
+
} catch (e) {
|
|
502
|
+
console.error('❌ Não consegui listar as tabelas antes de limpar:', formatError(e));
|
|
503
|
+
process.exit(1);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
if (!skipConfirm) {
|
|
507
|
+
const ok = await promptConfirmation('confirmar');
|
|
508
|
+
if (!ok) {
|
|
509
|
+
console.log('🚫 Cancelado — nenhuma alteração feita.');
|
|
510
|
+
return;
|
|
511
|
+
}
|
|
512
|
+
} else {
|
|
513
|
+
console.log('↳ --yes informado, pulando confirmação interativa.');
|
|
514
|
+
}
|
|
515
|
+
|
|
343
516
|
try {
|
|
344
517
|
console.log(tableName ? `🧹 Clearing ${tableName}...` : '🧹 Clearing all seeded tables...');
|
|
345
518
|
const res = await postJson('/api/seeds/clear', tableName ? { tableName } : {});
|
|
346
519
|
printSeedClearResults(res.results || []);
|
|
347
520
|
} catch (e) {
|
|
348
|
-
console.error('❌ Clear failed:', e
|
|
521
|
+
console.error('❌ Clear failed:', formatError(e));
|
|
349
522
|
process.exit(1);
|
|
350
523
|
}
|
|
351
524
|
}
|
|
@@ -364,7 +537,9 @@ Commands:
|
|
|
364
537
|
seed [table] Apply seed file(s) from seedsDir into DynamoDB
|
|
365
538
|
(no args = all matching tables)
|
|
366
539
|
seed:clear [table] Delete all items from the given table (or all
|
|
367
|
-
tables with a seed file when no arg is given)
|
|
540
|
+
tables with a seed file when no arg is given).
|
|
541
|
+
Pede confirmação interativa (digitar "confirmar")
|
|
542
|
+
antes de qualquer escrita.
|
|
368
543
|
help Show this help message
|
|
369
544
|
|
|
370
545
|
Options:
|
|
@@ -372,6 +547,7 @@ Options:
|
|
|
372
547
|
--external Connect to a LocalStack already running, do not spawn a container
|
|
373
548
|
--pro Use the LocalStack Pro image (requires LOCALSTACK_AUTH_TOKEN)
|
|
374
549
|
--localstack-token <token> Pass a LOCALSTACK_AUTH_TOKEN to the container
|
|
550
|
+
--yes, -y Skip interactive confirmation on seed:clear (use only in CI)
|
|
375
551
|
|
|
376
552
|
Environment:
|
|
377
553
|
LOCALSTACK_AUTH_TOKEN Token forwarded to LocalStack (Pro and >=2026.5 community)
|
|
@@ -411,7 +587,8 @@ Examples:
|
|
|
411
587
|
npx lss logs # View logs
|
|
412
588
|
npx lss seed # Seed every table that has a {name}.json file
|
|
413
589
|
npx lss seed users # Seed only the "users" table
|
|
414
|
-
npx lss seed:clear users # Delete all items from "users"
|
|
590
|
+
npx lss seed:clear users # Delete all items from "users" (com confirmação)
|
|
591
|
+
npx lss seed:clear users --yes # Mesma coisa, sem prompt (CI)
|
|
415
592
|
`);
|
|
416
593
|
}
|
|
417
594
|
|
|
@@ -432,6 +609,17 @@ function showLogs() {
|
|
|
432
609
|
|
|
433
610
|
const command = process.argv[2];
|
|
434
611
|
|
|
612
|
+
// First positional arg after the command (e.g. table name for `seed`/`seed:clear`).
|
|
613
|
+
// Skip anything that looks like a flag so `seed:clear --yes` doesn't pass
|
|
614
|
+
// "--yes" as the table name.
|
|
615
|
+
function firstPositional() {
|
|
616
|
+
for (let i = 3; i < process.argv.length; i++) {
|
|
617
|
+
const arg = process.argv[i];
|
|
618
|
+
if (!arg.startsWith('-')) return arg;
|
|
619
|
+
}
|
|
620
|
+
return undefined;
|
|
621
|
+
}
|
|
622
|
+
|
|
435
623
|
switch (command) {
|
|
436
624
|
case 'start':
|
|
437
625
|
startOrchestrator();
|
|
@@ -446,10 +634,10 @@ switch (command) {
|
|
|
446
634
|
showLogs();
|
|
447
635
|
break;
|
|
448
636
|
case 'seed':
|
|
449
|
-
runSeed(
|
|
637
|
+
runSeed(firstPositional());
|
|
450
638
|
break;
|
|
451
639
|
case 'seed:clear':
|
|
452
|
-
clearSeed(
|
|
640
|
+
clearSeed(firstPositional());
|
|
453
641
|
break;
|
|
454
642
|
case 'help':
|
|
455
643
|
case '--help':
|
|
@@ -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;AAsExB,OAAO,EAAE,MAAM,IAAI,WAAW,EAAE,CAAC"}
|
|
@@ -16,10 +16,15 @@ function getRegion(req) {
|
|
|
16
16
|
}
|
|
17
17
|
router.get('/', async (req, res) => {
|
|
18
18
|
try {
|
|
19
|
-
const
|
|
19
|
+
const region = getRegion(req);
|
|
20
|
+
const [entries, liveTables] = await Promise.all([
|
|
21
|
+
seeds.list(region),
|
|
22
|
+
seeds.listLiveTables(region),
|
|
23
|
+
]);
|
|
20
24
|
res.json({
|
|
21
25
|
seedsDir: ConfigManager.getInstance().getSeedsDir(),
|
|
22
26
|
entries,
|
|
27
|
+
liveTables,
|
|
23
28
|
});
|
|
24
29
|
}
|
|
25
30
|
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,SAAS,SAAS,CAAC,GAAY;IAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;IACpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"seeds.js","sourceRoot":"","sources":["../../../src/server/routes/seeds.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,10 +25,12 @@ export declare class SeedManager {
|
|
|
25
25
|
setDefaultRegion(region: string): void;
|
|
26
26
|
setRegion(region: string): void;
|
|
27
27
|
private clientFor;
|
|
28
|
+
private assertLocalEndpoint;
|
|
28
29
|
private getSeedsDir;
|
|
29
30
|
private seedFilePath;
|
|
30
31
|
private readSeedFile;
|
|
31
32
|
hasSeedFile(tableName: string): boolean;
|
|
33
|
+
listLiveTables(region?: string): Promise<string[]>;
|
|
32
34
|
list(region?: string): Promise<SeedFileEntry[]>;
|
|
33
35
|
seedTable(tableName: string, region?: string): Promise<SeedResult>;
|
|
34
36
|
seedAll(region?: string): Promise<SeedResult[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seed-manager.d.ts","sourceRoot":"","sources":["../../../src/server/services/seed-manager.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAc;IACrC,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,aAAa,CAAuB;IAE5C,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,WAAW;IAOjC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKtC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,OAAO,CAAC,SAAS;
|
|
1
|
+
{"version":3,"file":"seed-manager.d.ts","sourceRoot":"","sources":["../../../src/server/services/seed-manager.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAc;IACrC,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,aAAa,CAAuB;IAE5C,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,WAAW;IAOjC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKtC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,OAAO,CAAC,SAAS;IAejB,OAAO,CAAC,mBAAmB;IAoC3B,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;IAgBpB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAIjC,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAIlD,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAyB/C,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAkClE,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAwB/C,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA2CpE,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAyB7D;;;OAGG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;YAQ9C,UAAU;YAUV,qBAAqB;YAerB,mBAAmB;CAoBlC"}
|
|
@@ -34,6 +34,41 @@ export class SeedManager {
|
|
|
34
34
|
}
|
|
35
35
|
return client;
|
|
36
36
|
}
|
|
37
|
+
// Defensive guard against destructive ops ever hitting a non-local endpoint.
|
|
38
|
+
// Architecture already pins us to LocalStack, but `clearTable`/`clearAllSeeded`
|
|
39
|
+
// are explicit deletes — verify the endpoint hostname every time and refuse
|
|
40
|
+
// anything that isn't loopback/local before issuing a DeleteRequest.
|
|
41
|
+
assertLocalEndpoint() {
|
|
42
|
+
const endpoint = LocalStackManager.getInstance().getEndpoint();
|
|
43
|
+
let hostname;
|
|
44
|
+
try {
|
|
45
|
+
hostname = new URL(endpoint).hostname.toLowerCase();
|
|
46
|
+
// URL.hostname wraps IPv6 in brackets (e.g. "[::1]"). Normalize them out
|
|
47
|
+
// so the allowlist matches "::1" directly.
|
|
48
|
+
if (hostname.startsWith('[') && hostname.endsWith(']')) {
|
|
49
|
+
hostname = hostname.slice(1, -1);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
throw new Error(`Refusing destructive operation: invalid LocalStack endpoint "${endpoint}".`);
|
|
54
|
+
}
|
|
55
|
+
const allowed = new Set([
|
|
56
|
+
'localhost',
|
|
57
|
+
'127.0.0.1',
|
|
58
|
+
'::1',
|
|
59
|
+
'0.0.0.0',
|
|
60
|
+
'host.docker.internal',
|
|
61
|
+
'localstack',
|
|
62
|
+
'lss-localstack',
|
|
63
|
+
]);
|
|
64
|
+
const isAllowed = allowed.has(hostname) ||
|
|
65
|
+
hostname.endsWith('.localhost') ||
|
|
66
|
+
hostname.startsWith('lss-localstack-');
|
|
67
|
+
if (!isAllowed) {
|
|
68
|
+
throw new Error(`Refusing destructive operation: endpoint "${endpoint}" is not a recognized local LocalStack host. ` +
|
|
69
|
+
`seed:clear may ONLY run against LocalStack — never against AWS.`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
37
72
|
getSeedsDir() {
|
|
38
73
|
return ConfigManager.getInstance().getSeedsDir();
|
|
39
74
|
}
|
|
@@ -60,6 +95,9 @@ export class SeedManager {
|
|
|
60
95
|
hasSeedFile(tableName) {
|
|
61
96
|
return fs.existsSync(this.seedFilePath(tableName));
|
|
62
97
|
}
|
|
98
|
+
async listLiveTables(region) {
|
|
99
|
+
return this.listTables(region);
|
|
100
|
+
}
|
|
63
101
|
async list(region) {
|
|
64
102
|
const dir = this.getSeedsDir();
|
|
65
103
|
if (!fs.existsSync(dir))
|
|
@@ -137,6 +175,7 @@ export class SeedManager {
|
|
|
137
175
|
return results;
|
|
138
176
|
}
|
|
139
177
|
async clearTable(tableName, region) {
|
|
178
|
+
this.assertLocalEndpoint();
|
|
140
179
|
const keyAttrs = await this.getTableKeyAttributes(tableName, region);
|
|
141
180
|
if (!keyAttrs) {
|
|
142
181
|
return { tableName, deleted: 0, skipped: true, reason: 'table not found' };
|
|
@@ -170,6 +209,7 @@ export class SeedManager {
|
|
|
170
209
|
return { tableName, deleted };
|
|
171
210
|
}
|
|
172
211
|
async clearAllSeeded(region) {
|
|
212
|
+
this.assertLocalEndpoint();
|
|
173
213
|
const entries = await this.list(region);
|
|
174
214
|
const results = [];
|
|
175
215
|
for (const entry of entries) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seed-manager.js","sourceRoot":"","sources":["../../../src/server/services/seed-manager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"seed-manager.js","sourceRoot":"","sources":["../../../src/server/services/seed-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as R,v as Q,Q as W,i as k,G as t,f as c,S as n,d as b,w as d,n as o,A as g,m as r,h as m,E as p,_ as I,j as U,b as X,k as K,R as F,s as N,D as Y,p as S,U as Z,M as ee,K as T,J as te,V as ae,W as le,F as ne,O as oe,y as u,g as ie,L as re}from"./index-
|
|
1
|
+
import{o as R,v as Q,Q as W,i as k,G as t,f as c,S as n,d as b,w as d,n as o,A as g,m as r,h as m,E as p,_ as I,j as U,b as X,k as K,R as F,s as N,D as Y,p as S,U as Z,M as ee,K as T,J as te,V as ae,W as le,F as ne,O as oe,y as u,g as ie,L as re}from"./index-D3WwZ4lY.js";const ue={style:{"font-size":"1.1rem"}},se={key:1,style:{display:"flex","justify-content":"center",padding:"2rem"}},de={key:0,style:{display:"flex","justify-content":"center",padding:"2rem"}},ce=["href"],fe=["href"],ve=R({__name:"BucketDetail",props:{bucketName:{}},emits:["back"],setup(z,{emit:V}){const s=z,$=V,f=oe(),i=u(null),y=u([]),h=u(""),_=u(!0),B=u(!1),j=u(null),w=u(""),x=u(""),C=u("text/plain"),O=u(!1),L=[{key:"key",label:"Key"},{key:"size",label:"Size",align:"right"},{key:"lastModified",label:"Modified"},{key:"actions",label:"",align:"right"}],E=ie(()=>y.value.reduce((l,e)=>l+(e.size||0),0));function D(l){if(l==null)return"—";if(l===0)return"0 B";const e=["B","KB","MB","GB","TB"],a=Math.floor(Math.log(l)/Math.log(1024));return`${(l/Math.pow(1024,a)).toFixed(a===0?0:1)} ${e[a]}`}function A(l){return l?new Date(l).toLocaleString():"—"}async function M(){try{i.value=await b.getBucket(s.bucketName),j.value=null}catch(l){j.value=l.message||"Failed to load bucket",i.value=null}finally{_.value=!1}}async function v(){B.value=!0;try{const l=await b.listBucketObjects(s.bucketName,{prefix:h.value||void 0,maxKeys:200});y.value=l.objects}catch(l){f.add({title:"Failed to load objects",description:l.message,variant:"danger"})}finally{B.value=!1}}function G(l){return b.bucketObjectContentUrl(s.bucketName,l,!1)}function J(l){return b.bucketObjectContentUrl(s.bucketName,l,!0)}async function q(l){if(confirm(`Delete object "${l}"?`))try{await b.deleteBucketObject(s.bucketName,l),f.add({title:"Object deleted",variant:"info"}),await v()}catch(e){f.add({title:"Failed to delete object",description:e.message,variant:"danger"})}}async function H(){if(!w.value||!x.value){f.add({title:"Key and body are required",variant:"warning"});return}O.value=!0;try{await b.putBucketObject(s.bucketName,{key:w.value,body:x.value,contentType:C.value||void 0}),f.add({title:"Object uploaded",variant:"info"}),w.value="",x.value="",await v(),await M()}catch(l){f.add({title:"Failed to upload object",description:l.message,variant:"danger"})}finally{O.value=!1}}return Q(()=>{M(),v()}),W(()=>s.bucketName,()=>{M(),v()}),(l,e)=>(d(),k(t(c),{direction:"vertical",gap:"1rem"},{default:n(()=>[o(t(c),{direction:"horizontal",gap:"0.5rem",align:"center",justify:"space-between"},{default:n(()=>[o(t(c),{direction:"horizontal",gap:"0.5rem",align:"center"},{default:n(()=>{var a;return[o(t(g),{size:"sm",variant:"ghost",onClick:e[0]||(e[0]=P=>$("back"))},{default:n(()=>[...e[9]||(e[9]=[r("← Buckets",-1)])]),_:1}),m("strong",ue,p(z.bucketName),1),(a=i.value)!=null&&a.versioning?(d(),k(t(I),{key:0,tone:"info",variant:"soft"},{default:n(()=>[...e[10]||(e[10]=[r("Versioning",-1)])]),_:1})):U("",!0)]}),_:1}),o(t(g),{size:"sm",variant:"ghost",loading:B.value,onClick:e[1]||(e[1]=a=>v())},{default:n(()=>[...e[11]||(e[11]=[r("Refresh",-1)])]),_:1},8,["loading"])]),_:1}),j.value?(d(),k(t(X),{key:0,variant:"danger",dismissible:"",onDismiss:e[2]||(e[2]=a=>j.value=null)},{default:n(()=>[r(p(j.value),1)]),_:1})):U("",!0),_.value&&!i.value?(d(),K("div",se,[o(t(F),{label:"Loading bucket..."})])):i.value?(d(),K(ne,{key:2},[o(t(Y),{columns:4,gap:"0.75rem"},{default:n(()=>[o(t(N),{label:"Objects",value:i.value.objectCount??0,tone:"info"},null,8,["value"]),o(t(N),{label:"Size",value:D(i.value.totalSize),tone:"neutral"},null,8,["value"]),o(t(N),{label:"Versioning",value:i.value.versioning?"Enabled":"Disabled",tone:i.value.versioning?"success":"neutral"},null,8,["value","tone"]),o(t(N),{label:"Notifications",value:i.value.notifications??0,tone:(i.value.notifications??0)>0?"info":"neutral"},null,8,["value","tone"])]),_:1}),o(t(T),{variant:"outline"},{header:n(()=>[...e[12]||(e[12]=[m("strong",null,"Upload object",-1)])]),default:n(()=>[o(t(c),{direction:"vertical",gap:"0.5rem"},{default:n(()=>[o(t(S),{modelValue:w.value,"onUpdate:modelValue":e[3]||(e[3]=a=>w.value=a),placeholder:"object/key.txt",label:"Key"},null,8,["modelValue"]),o(t(S),{modelValue:C.value,"onUpdate:modelValue":e[4]||(e[4]=a=>C.value=a),placeholder:"text/plain",label:"Content-Type"},null,8,["modelValue"]),e[14]||(e[14]=m("label",{class:"muted",style:{"font-size":"0.875rem"}},"Body",-1)),Z(m("textarea",{"onUpdate:modelValue":e[5]||(e[5]=a=>x.value=a),rows:"4",style:{width:"100%","font-family":"var(--tree-font-mono, monospace)",padding:"0.5rem"},placeholder:"Hello, world!"},null,512),[[ee,x.value]]),o(t(c),{direction:"horizontal",justify:"flex-end"},{default:n(()=>[o(t(g),{size:"sm",loading:O.value,onClick:H},{default:n(()=>[...e[13]||(e[13]=[r("Upload",-1)])]),_:1},8,["loading"])]),_:1})]),_:1})]),_:1}),o(t(T),{variant:"outline"},{header:n(()=>[o(t(c),{direction:"horizontal",gap:"0.5rem",align:"center",justify:"space-between"},{default:n(()=>[m("strong",null,"Objects ("+p(y.value.length)+" · "+p(D(E.value))+")",1),o(t(c),{direction:"horizontal",gap:"0.5rem",align:"center"},{default:n(()=>[o(t(S),{modelValue:h.value,"onUpdate:modelValue":e[6]||(e[6]=a=>h.value=a),placeholder:"prefix filter",size:"sm",onKeyup:e[7]||(e[7]=le(a=>v(),["enter"]))},null,8,["modelValue"]),o(t(g),{size:"sm",variant:"ghost",onClick:e[8]||(e[8]=a=>v())},{default:n(()=>[...e[15]||(e[15]=[r("Apply",-1)])]),_:1})]),_:1})]),_:1})]),default:n(()=>[B.value?(d(),K("div",de,[o(t(F),{label:"Loading objects..."})])):y.value.length?(d(),k(t(ae),{key:2,columns:L,rows:y.value},{"cell-key":n(({row:a})=>[m("a",{href:G(String(a.key)),target:"_blank",rel:"noopener noreferrer",style:{"text-decoration":"none","font-weight":"500"}},p(a.key),9,ce)]),"cell-size":n(({row:a})=>[r(p(D(Number(a.size))),1)]),"cell-lastModified":n(({row:a})=>[r(p(A(a.lastModified)),1)]),"cell-actions":n(({row:a})=>[o(t(c),{direction:"horizontal",gap:"0.25rem",justify:"flex-end"},{default:n(()=>[m("a",{href:J(String(a.key)),target:"_blank",rel:"noopener noreferrer",style:{"text-decoration":"none"}},[o(t(g),{size:"sm",variant:"ghost"},{default:n(()=>[...e[16]||(e[16]=[r("Download",-1)])]),_:1})],8,fe),o(t(g),{size:"sm",variant:"ghost",tone:"danger",onClick:P=>q(String(a.key))},{default:n(()=>[...e[17]||(e[17]=[r(" Delete ",-1)])]),_:1},8,["onClick"])]),_:2},1024)]),_:1},8,["rows"])):(d(),k(t(te),{key:1,title:"No objects",description:"This bucket is empty (or the prefix filter excluded everything)."}))]),_:1})],64)):U("",!0)]),_:1}))}}),pe=R({__name:"BucketDetailPage",props:{bucketName:{}},setup(z){const V=re();function s(){V.push("/buckets")}return($,f)=>(d(),k(ve,{"bucket-name":z.bucketName,onBack:s},null,8,["bucket-name"]))}});export{pe as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as x,L as N,v as D,u as I,w as o,i as u,G as n,f as C,S as a,n as l,D as L,s as b,b as O,m as c,E as r,j as T,K as E,k as z,R as K,J as U,V as F,A as G,_ as p,a as J,B as P,h as _,X as q,y as m,g as j,d as R}from"./index-
|
|
1
|
+
import{o as x,L as N,v as D,u as I,w as o,i as u,G as n,f as C,S as a,n as l,D as L,s as b,b as O,m as c,E as r,j as T,K as E,k as z,R as K,J as U,V as F,A as G,_ as p,a as J,B as P,h as _,X as q,y as m,g as j,d as R}from"./index-D3WwZ4lY.js";const A={key:0,style:{display:"flex","justify-content":"center",padding:"2rem"}},X=["onClick"],H={key:1,class:"muted",style:{"font-size":"0.75rem"}},Q=x({__name:"BucketsView",setup(V){const y=N(),i=m([]),h=m({}),d=m(!0),v=m(null);let g=null;const $=[{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"}],M=j(()=>i.value.map(t=>({...t,service:h.value[t.name]||""}))),k=j(()=>({buckets:i.value.length,objects:i.value.reduce((t,s)=>t+(s.objectCount||0),0),size:i.value.reduce((t,s)=>t+(s.totalSize||0),0)}));function B(t){if(t==null)return"—";if(t===0)return"0 B";const s=["B","KB","MB","GB","TB"],e=Math.floor(Math.log(t)/Math.log(1024));return`${(t/Math.pow(1024,e)).toFixed(e===0?0:1)} ${s[e]}`}async function S(){try{const[t,s]=await Promise.all([R.listBuckets(),R.listResourceOwners().catch(()=>({tables:[],queues:[],topics:[],buckets:[]}))]);i.value=t;const e={};for(const f of s.buckets||[])e[f.name]=f.service;h.value=e,v.value=null}catch(t){v.value=t.message||"Failed to load buckets"}finally{d.value=!1}}function w(t){y.push(`/buckets/${encodeURIComponent(t)}`)}return D(()=>{S(),g=window.setInterval(S,1e4)}),I(()=>{g&&window.clearInterval(g)}),(t,s)=>(o(),u(n(C),{direction:"vertical",gap:"1.25rem"},{default:a(()=>[l(n(L),{columns:3,gap:"1rem"},{default:a(()=>[l(n(b),{label:"Buckets",value:k.value.buckets,tone:"info",loading:d.value},null,8,["value","loading"]),l(n(b),{label:"Objects",value:k.value.objects,tone:"success",loading:d.value},null,8,["value","loading"]),l(n(b),{label:"Total size",value:B(k.value.size),tone:"neutral",loading:d.value},null,8,["value","loading"])]),_:1}),v.value?(o(),u(n(O),{key:0,variant:"danger",dismissible:"",onDismiss:s[0]||(s[0]=e=>v.value=null)},{default:a(()=>[c(r(v.value),1)]),_:1})):T("",!0),l(n(E),{variant:"outline"},{header:a(()=>[l(n(C),{direction:"horizontal",gap:"0.5rem",align:"center",justify:"space-between"},{default:a(()=>[...s[1]||(s[1]=[_("strong",null,"S3 Buckets",-1),_("span",{class:"muted"},"Refreshes every 10s",-1)])]),_:1})]),default:a(()=>[d.value?(o(),z("div",A,[l(n(K),{label:"Loading buckets..."})])):i.value.length?(o(),u(n(F),{key:2,columns:$,rows:M.value},{"cell-name":a(({row:e})=>[_("a",{href:"#",style:{"text-decoration":"none","font-weight":"600"},onClick:q(f=>w(String(e.name)),["prevent"])},r(e.name),9,X)]),"cell-service":a(({row:e})=>[e.service?(o(),u(n(J),{key:0,to:`/services/${encodeURIComponent(String(e.service))}`,style:{"text-decoration":"none"}},{default:a(()=>[l(n(P),{size:"sm",variant:"soft",clickable:""},{default:a(()=>[c(r(e.service),1)]),_:2},1024)]),_:2},1032,["to"])):(o(),z("span",H,"unmanaged"))]),"cell-objectCount":a(({row:e})=>[l(n(p),{tone:"info",variant:"soft"},{default:a(()=>[c(r(e.objectCount??0),1)]),_:2},1024)]),"cell-totalSize":a(({row:e})=>[c(r(B(e.totalSize)),1)]),"cell-versioning":a(({row:e})=>[l(n(p),{tone:e.versioning?"success":"neutral",variant:"soft"},{default:a(()=>[c(r(e.versioning?"Enabled":"Disabled"),1)]),_:2},1032,["tone"])]),"cell-notifications":a(({row:e})=>[l(n(p),{tone:Number(e.notifications)>0?"info":"neutral",variant:"soft"},{default:a(()=>[c(r(e.notifications??0),1)]),_:2},1032,["tone"])]),"cell-actions":a(({row:e})=>[l(n(G),{size:"sm",variant:"ghost",onClick:f=>w(String(e.name))},{default:a(()=>[...s[2]||(s[2]=[c(" Open ",-1)])]),_:1},8,["onClick"])]),_:1},8,["rows"])):(o(),u(n(U),{key:1,title:"No buckets found",description:"Register a microservice that defines S3 resources or create buckets directly in LocalStack."}))]),_:1})]),_:1}))}}),Y=x({__name:"BucketsPage",setup(V){return(y,i)=>(o(),u(Q))}});export{Y as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{o as A,v as j,u as F,w as n,i,G as s,f as C,S as a,n as o,D as q,s as N,b as H,m as r,E as u,j as f,K as J,k as y,R as W,J as P,V as Q,A as X,B as p,_ as I,a as Y,h as L,p as Z,y as g,g as B,d as T,L as ee}from"./index-D3WwZ4lY.js";const te={key:0,style:{display:"flex","justify-content":"center",padding:"2rem"}},se=["onClick"],ae={key:1},ne={class:"muted mono",style:{"font-size":"0.75rem"}},le={key:1,class:"muted",style:{"font-size":"0.75rem"}},ie={key:1,class:"muted",style:{"font-size":"0.75rem"}},oe={key:1,class:"muted",style:{"font-size":"0.75rem"}},re=A({__name:"DynamoTablesList",emits:["open"],setup(M,{emit:D}){const w=D,d=g([]),b=g([]),R=g({}),c=g(!0),k=g(null),h=g("");let z=null;const U=[{key:"name",label:"Table"},{key:"service",label:"Service"},{key:"status",label:"Status"},{key:"itemCount",label:"Items",align:"right"},{key:"seed",label:"Seed"},{key:"features",label:"Features"},{key:"actions",label:"",align:"right"}],S=B(()=>{const l=d.value.map(e=>{var G,K;const t=(G=e.keySchema.find(_=>_.KeyType==="HASH"))==null?void 0:G.AttributeName,m=(K=e.keySchema.find(_=>_.KeyType==="RANGE"))==null?void 0:K.AttributeName,x=m?`PK: ${t} · SK: ${m}`:`PK: ${t??"—"}`,O=b.value.find(_=>_.tableName===e.name);return{name:e.name,status:e.status,itemCount:e.itemCount||0,keyDescriptor:x,billingMode:e.billingMode,ttlOn:e.ttl.enabled,streamOn:e.streamEnabled,hasGsi:e.hasGsi,hasLsi:e.hasLsi,service:R.value[e.name]||"",seedItemCount:O?O.itemCount:null,exists:!0}});for(const e of b.value)!e.tableExists&&!l.some(t=>t.name===e.tableName)&&l.push({name:e.tableName,status:"PENDING",itemCount:0,keyDescriptor:"—",ttlOn:!1,streamOn:!1,hasGsi:!1,hasLsi:!1,service:R.value[e.tableName]||"",seedItemCount:e.itemCount,exists:!1});return l.sort((e,t)=>e.name.localeCompare(t.name))}),E=B(()=>{const l=h.value.trim().toLowerCase();return l?S.value.filter(e=>e.name.toLowerCase().includes(l)||(e.service||"").toLowerCase().includes(l)):S.value}),v=B(()=>({tables:d.value.length,items:d.value.reduce((l,e)=>l+(e.itemCount||0),0),warnings:d.value.reduce((l,e)=>{var t;return l+(((t=e.warnings)==null?void 0:t.length)||0)},0),seedsPending:b.value.filter(l=>!l.tableExists).length}));async function V(){try{const[l,e,t]=await Promise.all([T.listDynamoTables(),T.listSeeds().catch(()=>({seedsDir:"",entries:[]})),T.listResourceOwners().catch(()=>({tables:[],queues:[],topics:[],buckets:[]}))]);d.value=l.tables,b.value=e.entries;const m={};for(const x of t.tables)m[x.name]=x.service;R.value=m,k.value=null}catch(l){k.value=l.message||"Failed to load DynamoDB tables"}finally{c.value=!1}}function $(l){l.exists&&w("open",l.name)}return j(()=>{V(),z=window.setInterval(V,15e3)}),F(()=>{z&&window.clearInterval(z)}),(l,e)=>(n(),i(s(C),{direction:"vertical",gap:"1.25rem"},{default:a(()=>[o(s(q),{columns:4,gap:"1rem"},{default:a(()=>[o(s(N),{label:"Tables",value:v.value.tables,tone:"info",loading:c.value},null,8,["value","loading"]),o(s(N),{label:"Total items",value:v.value.items,tone:"success",loading:c.value},null,8,["value","loading"]),o(s(N),{label:"Seeds pending",value:v.value.seedsPending,tone:v.value.seedsPending>0?"warning":"neutral",loading:c.value},null,8,["value","tone","loading"]),o(s(N),{label:"Warnings",value:v.value.warnings,tone:v.value.warnings>0?"warning":"neutral",loading:c.value},null,8,["value","tone","loading"])]),_:1}),k.value?(n(),i(s(H),{key:0,variant:"danger",dismissible:"",onDismiss:e[0]||(e[0]=t=>k.value=null)},{default:a(()=>[r(u(k.value),1)]),_:1})):f("",!0),o(s(J),{variant:"outline"},{header:a(()=>[o(s(C),{direction:"horizontal",justify:"space-between",align:"center",gap:"1rem"},{default:a(()=>[e[3]||(e[3]=L("strong",null,"DynamoDB tables",-1)),o(s(C),{direction:"horizontal",align:"center",gap:"1rem"},{default:a(()=>[o(s(Z),{modelValue:h.value,"onUpdate:modelValue":e[1]||(e[1]=t=>h.value=t),placeholder:"Filter tables...",style:{"min-width":"16rem"}},null,8,["modelValue"]),e[2]||(e[2]=L("span",{class:"muted",style:{"font-size":"0.75rem"}}," Rows with reduced opacity exist only as a seed file ",-1))]),_:1})]),_:1})]),default:a(()=>[c.value?(n(),y("div",te,[o(s(W),{label:"Loading tables..."})])):S.value.length?E.value.length?(n(),i(s(Q),{key:3,columns:U,rows:E.value,"row-class":t=>t.exists?"":"dim-row"},{"cell-name":a(({row:t})=>[o(s(C),{direction:"vertical",gap:"0.125rem"},{default:a(()=>[t.exists?(n(),y("strong",{key:0,style:{cursor:"pointer","text-decoration":"underline","text-decoration-style":"dotted","text-underline-offset":"3px"},onClick:m=>$(t)},u(t.name),9,se)):(n(),y("strong",ae,u(t.name),1)),L("span",ne,u(t.keyDescriptor),1)]),_:2},1024)]),"cell-service":a(({row:t})=>[t.service?(n(),i(s(Y),{key:0,to:`/services/${encodeURIComponent(String(t.service))}`,style:{"text-decoration":"none"}},{default:a(()=>[o(s(p),{size:"sm",variant:"soft",clickable:""},{default:a(()=>[r(u(t.service),1)]),_:2},1024)]),_:2},1032,["to"])):(n(),y("span",le,"—"))]),"cell-status":a(({row:t})=>[t.exists?(n(),i(s(I),{key:0,tone:t.status==="ACTIVE"?"success":"warning",variant:"soft"},{default:a(()=>[r(u(t.status||"UNKNOWN"),1)]),_:2},1032,["tone"])):(n(),i(s(I),{key:1,tone:"warning",variant:"outline"},{default:a(()=>[...e[4]||(e[4]=[r("Not created",-1)])]),_:1}))]),"cell-itemCount":a(({row:t})=>[r(u(t.exists?t.itemCount:"—"),1)]),"cell-seed":a(({row:t})=>[t.seedItemCount!==null?(n(),i(s(I),{key:0,tone:t.exists?"info":"warning",variant:"soft"},{default:a(()=>[r(u(t.seedItemCount)+" seeded item"+u(t.seedItemCount===1?"":"s"),1)]),_:2},1032,["tone"])):(n(),y("span",ie,"no seed"))]),"cell-features":a(({row:t})=>[o(s(C),{direction:"horizontal",gap:"0.25rem",wrap:""},{default:a(()=>[t.billingMode?(n(),i(s(p),{key:0,size:"sm",variant:"soft"},{default:a(()=>[r(u(t.billingMode),1)]),_:2},1024)):f("",!0),t.ttlOn?(n(),i(s(p),{key:1,size:"sm",variant:"solid"},{default:a(()=>[...e[5]||(e[5]=[r("TTL",-1)])]),_:1})):f("",!0),t.streamOn?(n(),i(s(p),{key:2,size:"sm",variant:"solid"},{default:a(()=>[...e[6]||(e[6]=[r("Streams",-1)])]),_:1})):f("",!0),t.hasGsi?(n(),i(s(p),{key:3,size:"sm",variant:"soft"},{default:a(()=>[...e[7]||(e[7]=[r("GSI",-1)])]),_:1})):f("",!0),t.hasLsi?(n(),i(s(p),{key:4,size:"sm",variant:"soft"},{default:a(()=>[...e[8]||(e[8]=[r("LSI",-1)])]),_:1})):f("",!0)]),_:2},1024)]),"cell-actions":a(({row:t})=>[t.exists?(n(),i(s(X),{key:0,size:"sm",variant:"soft",onClick:m=>$(t)},{default:a(()=>[...e[9]||(e[9]=[r(" Explore ",-1)])]),_:1},8,["onClick"])):(n(),y("span",oe," Register service to provision "))]),_:1},8,["rows","row-class"])):(n(),i(s(P),{key:2,title:"No matching tables",description:`No tables match "${h.value}".`},null,8,["description"])):(n(),i(s(P),{key:1,title:"No DynamoDB tables",description:"Register a microservice with DynamoDB resources or drop a seed file into the seeds directory."}))]),_:1})]),_:1}))}}),de=A({__name:"DynamoPage",setup(M){const D=ee();function w(d){D.push(`/dynamo/${encodeURIComponent(d)}`)}return(d,b)=>(n(),i(re,{onOpen:w}))}});export{de as default};
|