@gugananuvem/aws-local-simulator 1.0.8 → 1.0.9
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/bin/aws-local-simulator.js +62 -1
- package/package.json +10 -7
- package/src/config/config-loader.js +113 -0
- package/src/config/default-config.js +65 -0
- package/src/config/env-loader.js +67 -0
- package/src/index.js +131 -1
- package/src/index.mjs +124 -0
- package/src/server.js +219 -0
- package/src/services/apigateway/index.js +67 -0
- package/src/services/apigateway/server.js +435 -0
- package/src/services/apigateway/simulator.js +1252 -0
- package/src/services/cognito/index.js +66 -0
- package/src/services/cognito/server.js +229 -0
- package/src/services/cognito/simulator.js +848 -0
- package/src/services/dynamodb/index.js +71 -0
- package/src/services/dynamodb/server.js +122 -0
- package/src/services/dynamodb/simulator.js +614 -0
- package/src/services/eventbridge/index.js +85 -0
- package/src/services/index.js +19 -0
- package/src/services/lambda/handler-loader.js +173 -0
- package/src/services/lambda/index.js +73 -0
- package/src/services/lambda/route-registry.js +275 -0
- package/src/services/lambda/server.js +153 -0
- package/src/services/lambda/simulator.js +278 -0
- package/src/services/s3/index.js +70 -0
- package/src/services/s3/server.js +239 -0
- package/src/services/s3/simulator.js +740 -0
- package/src/services/sns/index.js +76 -0
- package/src/services/sqs/index.js +96 -0
- package/src/services/sqs/server.js +274 -0
- package/src/services/sqs/simulator.js +660 -0
- package/src/template/aws-config-template.js +88 -0
- package/src/template/aws-config-template.mjs +91 -0
- package/src/template/config-template.json +165 -0
- package/src/utils/aws-config.js +92 -0
- package/src/utils/local-store.js +68 -0
- package/src/utils/logger.js +60 -0
|
@@ -1,3 +1,64 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* CLI para AWS Local Simulator
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const { AWSLocalSimulator } = require('../src/index');
|
|
8
|
+
const logger = require('../src/utils/logger');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
|
|
11
|
+
const command = process.argv[2];
|
|
12
|
+
const configPath = process.argv[3];
|
|
13
|
+
|
|
14
|
+
const simulator = new AWSLocalSimulator({
|
|
15
|
+
configPath: configPath ? path.resolve(process.cwd(), configPath) : undefined
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
async function main() {
|
|
19
|
+
switch (command) {
|
|
20
|
+
case 'start':
|
|
21
|
+
await simulator.start();
|
|
22
|
+
break;
|
|
23
|
+
|
|
24
|
+
case 'stop':
|
|
25
|
+
await simulator.stop();
|
|
26
|
+
break;
|
|
27
|
+
|
|
28
|
+
case 'restart':
|
|
29
|
+
await simulator.restart();
|
|
30
|
+
break;
|
|
31
|
+
|
|
32
|
+
case 'reset':
|
|
33
|
+
await simulator.reset();
|
|
34
|
+
break;
|
|
35
|
+
|
|
36
|
+
case 'status':
|
|
37
|
+
const status = simulator.getStatus();
|
|
38
|
+
console.log(JSON.stringify(status, null, 2));
|
|
39
|
+
break;
|
|
40
|
+
|
|
41
|
+
case 'help':
|
|
42
|
+
default:
|
|
43
|
+
console.log(`
|
|
44
|
+
AWS Local Simulator - CLI Commands:
|
|
45
|
+
start [configPath] - Inicia o simulador
|
|
46
|
+
stop - Para o simulador
|
|
47
|
+
restart - Reinicia o simulador
|
|
48
|
+
reset - Reseta todos os dados
|
|
49
|
+
status - Mostra status dos serviços
|
|
50
|
+
help - Mostra esta ajuda
|
|
51
|
+
|
|
52
|
+
Exemplos:
|
|
53
|
+
npx aws-local-simulator start
|
|
54
|
+
npx aws-local-simulator start ./my-config.json
|
|
55
|
+
AWS_LOCAL_SIMULATOR_LOG=verboso npx aws-local-simulator start
|
|
56
|
+
`);
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
main().catch(error => {
|
|
62
|
+
logger.error('Erro:', error);
|
|
63
|
+
process.exit(1);
|
|
64
|
+
});
|
package/package.json
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gugananuvem/aws-local-simulator",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"description": "Simulador local completo para serviços AWS",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"aws-local-simulator": "bin/aws-local-simulator.js"
|
|
8
8
|
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"start": "node bin/aws-local-simulator.js start"
|
|
11
|
+
},
|
|
9
12
|
"jest": {
|
|
10
13
|
"setupFilesAfterEnv": [
|
|
11
14
|
"<rootDir>/tests/setup.js"
|
|
@@ -59,7 +62,10 @@
|
|
|
59
62
|
"node": ">=14.0.0"
|
|
60
63
|
},
|
|
61
64
|
"files": [
|
|
62
|
-
"
|
|
65
|
+
"src/",
|
|
66
|
+
"bin/",
|
|
67
|
+
"README.md",
|
|
68
|
+
"LICENSE"
|
|
63
69
|
],
|
|
64
70
|
"publishConfig": {
|
|
65
71
|
"directory": "dist"
|
|
@@ -103,9 +109,6 @@
|
|
|
103
109
|
"optional": true
|
|
104
110
|
}
|
|
105
111
|
},
|
|
106
|
-
"
|
|
107
|
-
|
|
108
|
-
},
|
|
109
|
-
"obfuscated": true,
|
|
110
|
-
"obfuscatedAt": "2026-03-29T02:34:32.163Z"
|
|
112
|
+
"buildDate": "2026-03-29T02:36:24.504Z",
|
|
113
|
+
"published": true
|
|
111
114
|
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Carrega configurações do usuário
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
const fs = require('fs');
|
|
6
|
+
const path = require('path');
|
|
7
|
+
const defaultConfig = require('./default-config');
|
|
8
|
+
const EnvLoader = require('./env-loader');
|
|
9
|
+
const logger = require('../utils/logger');
|
|
10
|
+
|
|
11
|
+
class ConfigLoader {
|
|
12
|
+
static async load(configPath) {
|
|
13
|
+
logger.info('📝 Carregando configurações...');
|
|
14
|
+
|
|
15
|
+
// 1. Carrega configurações padrão
|
|
16
|
+
let config = { ...defaultConfig };
|
|
17
|
+
|
|
18
|
+
// 2. Sobrescreve com variáveis de ambiente
|
|
19
|
+
const envConfig = EnvLoader.load();
|
|
20
|
+
config = this.mergeDeep(config, envConfig);
|
|
21
|
+
|
|
22
|
+
// 3. Sobrescreve com arquivo de configuração do usuário se existir
|
|
23
|
+
if (configPath) {
|
|
24
|
+
const userConfig = await this.loadUserConfig(configPath);
|
|
25
|
+
config = this.mergeDeep(config, userConfig);
|
|
26
|
+
} else {
|
|
27
|
+
// Tenta encontrar arquivo de configuração padrão
|
|
28
|
+
const possiblePaths = [
|
|
29
|
+
path.join(process.cwd(), 'aws-local-simulator.json'),
|
|
30
|
+
path.join(process.cwd(), 'aws-local-simulator.config.json'),
|
|
31
|
+
path.join(process.cwd(), '.aws-local-simulator.json')
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
for (const possiblePath of possiblePaths) {
|
|
35
|
+
if (fs.existsSync(possiblePath)) {
|
|
36
|
+
const userConfig = await this.loadUserConfig(possiblePath);
|
|
37
|
+
config = this.mergeDeep(config, userConfig);
|
|
38
|
+
logger.info(`✅ Configuração carregada de: ${possiblePath}`);
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// 4. Valida configurações
|
|
45
|
+
this.validate(config);
|
|
46
|
+
|
|
47
|
+
logger.info(`✅ Configurações carregadas (logLevel: ${config.logLevel})`);
|
|
48
|
+
|
|
49
|
+
return config;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
static async loadUserConfig(filePath) {
|
|
53
|
+
try {
|
|
54
|
+
const fullPath = path.resolve(process.cwd(), filePath);
|
|
55
|
+
|
|
56
|
+
if (!fs.existsSync(fullPath)) {
|
|
57
|
+
logger.warn(`Arquivo de configuração não encontrado: ${fullPath}`);
|
|
58
|
+
return {};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const content = fs.readFileSync(fullPath, 'utf8');
|
|
62
|
+
const config = JSON.parse(content);
|
|
63
|
+
|
|
64
|
+
return config;
|
|
65
|
+
} catch (error) {
|
|
66
|
+
logger.error(`Erro ao carregar configuração de ${filePath}:`, error);
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
static validate(config) {
|
|
72
|
+
// Valida serviços
|
|
73
|
+
const enabledServices = Object.entries(config.services)
|
|
74
|
+
.filter(([_, enabled]) => enabled)
|
|
75
|
+
.map(([name]) => name);
|
|
76
|
+
|
|
77
|
+
if (enabledServices.length === 0) {
|
|
78
|
+
logger.warn('⚠️ Nenhum serviço está habilitado!');
|
|
79
|
+
} else {
|
|
80
|
+
logger.info(`📦 Serviços habilitados: ${enabledServices.join(', ')}`);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Valida diretório de dados
|
|
84
|
+
if (!config.dataDir) {
|
|
85
|
+
throw new Error('dataDir não configurado');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Valida portas
|
|
89
|
+
for (const [service, port] of Object.entries(config.ports)) {
|
|
90
|
+
if (config.services[service] && (port < 1 || port > 65535)) {
|
|
91
|
+
throw new Error(`Porta inválida para ${service}: ${port}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
static mergeDeep(target, source) {
|
|
97
|
+
const output = { ...target };
|
|
98
|
+
|
|
99
|
+
for (const key in source) {
|
|
100
|
+
if (source.hasOwnProperty(key)) {
|
|
101
|
+
if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {
|
|
102
|
+
output[key] = this.mergeDeep(target[key] || {}, source[key]);
|
|
103
|
+
} else {
|
|
104
|
+
output[key] = source[key];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return output;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
module.exports = { loadConfig: ConfigLoader.load.bind(ConfigLoader) };
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configurações padrão do simulador
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
module.exports = {
|
|
6
|
+
// Serviços habilitados por padrão
|
|
7
|
+
services: {
|
|
8
|
+
dynamodb: true,
|
|
9
|
+
s3: true,
|
|
10
|
+
sqs: true,
|
|
11
|
+
lambda: true,
|
|
12
|
+
sns: false, // Desabilitado por padrão
|
|
13
|
+
eventbridge: false, // Desabilitado por padrão
|
|
14
|
+
ecs: false,
|
|
15
|
+
cognito: false,
|
|
16
|
+
apigateway: false,
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
// Portas padrão
|
|
20
|
+
ports: {
|
|
21
|
+
dynamodb: 8000,
|
|
22
|
+
s3: 4566,
|
|
23
|
+
sqs: 9324,
|
|
24
|
+
lambda: 3001,
|
|
25
|
+
sns: 9911,
|
|
26
|
+
eventbridge: 4010,
|
|
27
|
+
ecs: 8080,
|
|
28
|
+
cognito: 9229,
|
|
29
|
+
apigateway: 4567,
|
|
30
|
+
},
|
|
31
|
+
apigateway: {
|
|
32
|
+
defaultCors: {
|
|
33
|
+
allowOrigins: ["*"],
|
|
34
|
+
allowMethods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
|
|
35
|
+
allowHeaders: ["*"],
|
|
36
|
+
maxAge: 300,
|
|
37
|
+
},
|
|
38
|
+
defaultThrottling: {
|
|
39
|
+
burstLimit: 100,
|
|
40
|
+
rateLimit: 10,
|
|
41
|
+
},
|
|
42
|
+
enableAccessLogging: true,
|
|
43
|
+
autoDeploy: true,
|
|
44
|
+
},
|
|
45
|
+
// Configurações de persistência
|
|
46
|
+
dataDir: "./.aws-local-simulator-data",
|
|
47
|
+
|
|
48
|
+
// Configurações de logging
|
|
49
|
+
logLevel: "info", // silent, info, debug, verboso
|
|
50
|
+
|
|
51
|
+
// Configurações das Lambdas
|
|
52
|
+
lambdas: [], // Será preenchido pelo usuário
|
|
53
|
+
|
|
54
|
+
// Configurações de CORS
|
|
55
|
+
cors: true,
|
|
56
|
+
|
|
57
|
+
// Auto-criação de tabelas DynamoDB
|
|
58
|
+
autoCreateTables: true,
|
|
59
|
+
|
|
60
|
+
// Auto-criação de buckets S3
|
|
61
|
+
autoCreateBuckets: true,
|
|
62
|
+
|
|
63
|
+
// Configurações adicionais
|
|
64
|
+
additional: {},
|
|
65
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Carrega configurações de variáveis de ambiente
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
const logger = require('../utils/logger');
|
|
6
|
+
|
|
7
|
+
class EnvLoader {
|
|
8
|
+
static load() {
|
|
9
|
+
const config = {};
|
|
10
|
+
|
|
11
|
+
// Carrega configuração de serviços
|
|
12
|
+
config.services = {
|
|
13
|
+
dynamodb: this.getEnvBool('AWS_LOCAL_SIMULATOR_DYNAMODB', true),
|
|
14
|
+
s3: this.getEnvBool('AWS_LOCAL_SIMULATOR_S3', true),
|
|
15
|
+
sqs: this.getEnvBool('AWS_LOCAL_SIMULATOR_SQS', true),
|
|
16
|
+
lambda: this.getEnvBool('AWS_LOCAL_SIMULATOR_LAMBDA', true),
|
|
17
|
+
sns: this.getEnvBool('AWS_LOCAL_SIMULATOR_SNS', false),
|
|
18
|
+
eventbridge: this.getEnvBool('AWS_LOCAL_SIMULATOR_EVENTBRIDGE', false)
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
// Carrega portas
|
|
22
|
+
config.ports = {
|
|
23
|
+
dynamodb: this.getEnvInt('AWS_LOCAL_SIMULATOR_DYNAMODB_PORT', 8000),
|
|
24
|
+
s3: this.getEnvInt('AWS_LOCAL_SIMULATOR_S3_PORT', 4566),
|
|
25
|
+
sqs: this.getEnvInt('AWS_LOCAL_SIMULATOR_SQS_PORT', 9324),
|
|
26
|
+
lambda: this.getEnvInt('AWS_LOCAL_SIMULATOR_LAMBDA_PORT', 3001),
|
|
27
|
+
sns: this.getEnvInt('AWS_LOCAL_SIMULATOR_SNS_PORT', 9911),
|
|
28
|
+
eventbridge: this.getEnvInt('AWS_LOCAL_SIMULATOR_EVENTBRIDGE_PORT', 4010)
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// Carrega diretório de dados
|
|
32
|
+
config.dataDir = process.env.AWS_LOCAL_SIMULATOR_DATA || './.aws-local-simulator-data';
|
|
33
|
+
|
|
34
|
+
// Carrega nível de log
|
|
35
|
+
config.logLevel = process.env.AWS_LOCAL_SIMULATOR_LOG || 'info';
|
|
36
|
+
|
|
37
|
+
// Carrega CORS
|
|
38
|
+
config.cors = this.getEnvBool('AWS_LOCAL_SIMULATOR_CORS', true);
|
|
39
|
+
|
|
40
|
+
// Carrega auto-create
|
|
41
|
+
config.autoCreateTables = this.getEnvBool('AWS_LOCAL_SIMULATOR_AUTO_CREATE_TABLES', true);
|
|
42
|
+
config.autoCreateBuckets = this.getEnvBool('AWS_LOCAL_SIMULATOR_AUTO_CREATE_BUCKETS', true);
|
|
43
|
+
|
|
44
|
+
logger.debug('Variáveis de ambiente carregadas:', config);
|
|
45
|
+
|
|
46
|
+
return config;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
static getEnvBool(key, defaultValue) {
|
|
50
|
+
const value = process.env[key];
|
|
51
|
+
if (value === undefined) return defaultValue;
|
|
52
|
+
return value === 'true' || value === '1' || value === 'yes';
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
static getEnvInt(key, defaultValue) {
|
|
56
|
+
const value = process.env[key];
|
|
57
|
+
if (value === undefined) return defaultValue;
|
|
58
|
+
const parsed = parseInt(value, 10);
|
|
59
|
+
return isNaN(parsed) ? defaultValue : parsed;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
static getEnvString(key, defaultValue) {
|
|
63
|
+
return process.env[key] || defaultValue;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
module.exports = EnvLoader;
|
package/src/index.js
CHANGED
|
@@ -1 +1,131 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* AWS Local Simulator - Entry Point Principal
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
const Server = require('./server');
|
|
6
|
+
const { loadConfig } = require('./config/config-loader');
|
|
7
|
+
const logger = require('./utils/logger');
|
|
8
|
+
|
|
9
|
+
// Exporta serviços para uso programático
|
|
10
|
+
const DynamoDBService = require('./services/dynamodb');
|
|
11
|
+
const S3Service = require('./services/s3');
|
|
12
|
+
const SQSService = require('./services/sqs');
|
|
13
|
+
const LambdaService = require('./services/lambda');
|
|
14
|
+
const SNSService = require('./services/sns');
|
|
15
|
+
const EventBridgeService = require('./services/eventbridge');
|
|
16
|
+
|
|
17
|
+
// Exporta utilitários
|
|
18
|
+
const LocalStore = require('./utils/local-store');
|
|
19
|
+
const HandlerLoader = require('./services/lambda/handler-loader');
|
|
20
|
+
const RouteRegistry = require('./services/lambda/route-registry');
|
|
21
|
+
|
|
22
|
+
class AWSLocalSimulator {
|
|
23
|
+
constructor(options = {}) {
|
|
24
|
+
this.options = options;
|
|
25
|
+
this.server = null;
|
|
26
|
+
this.isRunning = false;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async start() {
|
|
30
|
+
if (this.isRunning) {
|
|
31
|
+
logger.warn('Simulador já está rodando');
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
const config = await loadConfig(this.options.configPath);
|
|
37
|
+
this.server = new Server(config);
|
|
38
|
+
await this.server.start();
|
|
39
|
+
this.isRunning = true;
|
|
40
|
+
logger.success('✅ AWS Local Simulator iniciado com sucesso');
|
|
41
|
+
return this;
|
|
42
|
+
} catch (error) {
|
|
43
|
+
logger.error('❌ Erro ao iniciar simulador:', error);
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async stop() {
|
|
49
|
+
if (!this.isRunning || !this.server) {
|
|
50
|
+
logger.warn('Simulador não está rodando');
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
try {
|
|
55
|
+
await this.server.stop();
|
|
56
|
+
this.isRunning = false;
|
|
57
|
+
logger.info('🛑 AWS Local Simulator parado');
|
|
58
|
+
return this;
|
|
59
|
+
} catch (error) {
|
|
60
|
+
logger.error('❌ Erro ao parar simulador:', error);
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async restart() {
|
|
66
|
+
await this.stop();
|
|
67
|
+
await this.start();
|
|
68
|
+
return this;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async reset() {
|
|
72
|
+
if (!this.server) {
|
|
73
|
+
throw new Error('Simulador não iniciado');
|
|
74
|
+
}
|
|
75
|
+
await this.server.reset();
|
|
76
|
+
logger.success('🗑️ Todos os dados foram resetados');
|
|
77
|
+
return this;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
getStatus() {
|
|
81
|
+
if (!this.server) {
|
|
82
|
+
return { running: false };
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
running: this.isRunning,
|
|
86
|
+
services: this.server.getStatus()
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
getService(serviceName) {
|
|
91
|
+
if (!this.server) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
return this.server.getService(serviceName);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Métodos de conveniência
|
|
98
|
+
getDynamoDB() {
|
|
99
|
+
return this.getService('dynamodb')?.getSimulator();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
getS3() {
|
|
103
|
+
return this.getService('s3')?.getSimulator();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
getSQS() {
|
|
107
|
+
return this.getService('sqs')?.getSimulator();
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
getLambda() {
|
|
111
|
+
return this.getService('lambda')?.getSimulator();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Exporta classes e utilitários
|
|
116
|
+
module.exports = {
|
|
117
|
+
AWSLocalSimulator,
|
|
118
|
+
Server,
|
|
119
|
+
DynamoDBService,
|
|
120
|
+
S3Service,
|
|
121
|
+
SQSService,
|
|
122
|
+
LambdaService,
|
|
123
|
+
SNSService,
|
|
124
|
+
EventBridgeService,
|
|
125
|
+
LocalStore,
|
|
126
|
+
HandlerLoader,
|
|
127
|
+
RouteRegistry
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
// Exporta também como default para ES Modules compatibilidade
|
|
131
|
+
module.exports.default = AWSLocalSimulator;
|
package/src/index.mjs
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AWS Local Simulator - ES Module Entry Point
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import Server from './server.js';
|
|
6
|
+
import { loadConfig } from './config/config-loader.js';
|
|
7
|
+
import logger from './utils/logger.js';
|
|
8
|
+
import DynamoDBService from './services/dynamodb/index.js';
|
|
9
|
+
import S3Service from './services/s3/index.js';
|
|
10
|
+
import SQSService from './services/sqs/index.js';
|
|
11
|
+
import LambdaService from './services/lambda/index.js';
|
|
12
|
+
import SNSService from './services/sns/index.js';
|
|
13
|
+
import EventBridgeService from './services/eventbridge/index.js';
|
|
14
|
+
import LocalStore from './utils/local-store.js';
|
|
15
|
+
import HandlerLoader from './services/lambda/handler-loader.js';
|
|
16
|
+
import RouteRegistry from './services/lambda/route-registry.js';
|
|
17
|
+
|
|
18
|
+
export class AWSLocalSimulator {
|
|
19
|
+
constructor(options = {}) {
|
|
20
|
+
this.options = options;
|
|
21
|
+
this.server = null;
|
|
22
|
+
this.isRunning = false;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async start() {
|
|
26
|
+
if (this.isRunning) {
|
|
27
|
+
logger.warn('Simulador já está rodando');
|
|
28
|
+
return this;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
const config = await loadConfig(this.options.configPath);
|
|
33
|
+
this.server = new Server(config);
|
|
34
|
+
await this.server.start();
|
|
35
|
+
this.isRunning = true;
|
|
36
|
+
logger.success('✅ AWS Local Simulator iniciado com sucesso');
|
|
37
|
+
return this;
|
|
38
|
+
} catch (error) {
|
|
39
|
+
logger.error('❌ Erro ao iniciar simulador:', error);
|
|
40
|
+
throw error;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async stop() {
|
|
45
|
+
if (!this.isRunning || !this.server) {
|
|
46
|
+
logger.warn('Simulador não está rodando');
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
try {
|
|
51
|
+
await this.server.stop();
|
|
52
|
+
this.isRunning = false;
|
|
53
|
+
logger.info('🛑 AWS Local Simulator parado');
|
|
54
|
+
return this;
|
|
55
|
+
} catch (error) {
|
|
56
|
+
logger.error('❌ Erro ao parar simulador:', error);
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async restart() {
|
|
62
|
+
await this.stop();
|
|
63
|
+
await this.start();
|
|
64
|
+
return this;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async reset() {
|
|
68
|
+
if (!this.server) {
|
|
69
|
+
throw new Error('Simulador não iniciado');
|
|
70
|
+
}
|
|
71
|
+
await this.server.reset();
|
|
72
|
+
logger.success('🗑️ Todos os dados foram resetados');
|
|
73
|
+
return this;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
getStatus() {
|
|
77
|
+
if (!this.server) {
|
|
78
|
+
return { running: false };
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
running: this.isRunning,
|
|
82
|
+
services: this.server.getStatus()
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
getService(serviceName) {
|
|
87
|
+
if (!this.server) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
return this.server.getService(serviceName);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
getDynamoDB() {
|
|
94
|
+
return this.getService('dynamodb')?.getSimulator();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
getS3() {
|
|
98
|
+
return this.getService('s3')?.getSimulator();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
getSQS() {
|
|
102
|
+
return this.getService('sqs')?.getSimulator();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
getLambda() {
|
|
106
|
+
return this.getService('lambda')?.getSimulator();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Exporta classes e utilitários
|
|
111
|
+
export {
|
|
112
|
+
Server,
|
|
113
|
+
DynamoDBService,
|
|
114
|
+
S3Service,
|
|
115
|
+
SQSService,
|
|
116
|
+
LambdaService,
|
|
117
|
+
SNSService,
|
|
118
|
+
EventBridgeService,
|
|
119
|
+
LocalStore,
|
|
120
|
+
HandlerLoader,
|
|
121
|
+
RouteRegistry
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
export default AWSLocalSimulator;
|