Skip to content

Commit e51b8c7

Browse files
committed
Fixing ci migration pipeline
1 parent 8e72d2f commit e51b8c7

6 files changed

Lines changed: 176 additions & 58 deletions

File tree

jest.config.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ module.exports = {
22
moduleFileExtensions: ['js', 'json', 'ts'],
33
rootDir: 'src',
44
testRegex: '.*\\.spec\\.ts$',
5-
testPathIgnorePatterns: ['.*\\.e2e\\.spec\\.ts$'], // Skip E2E tests by default
5+
testPathIgnorePatterns: [
6+
'.*\\.e2e\\.spec\\.ts$', // Skip E2E tests by default
7+
'src/standardization/.*\\.spec\\.ts$' // Skip standardization tests
8+
],
69
transform: {
710
'^.+\\.ts$': 'ts-jest',
811
'^.+\\.js$': 'babel-jest',
@@ -17,6 +20,7 @@ module.exports = {
1720
'!**/main.ts',
1821
'!**/migrations/**',
1922
'!**/seeds/**',
23+
'!**/standardization/**', // Exclude standardization from coverage
2024
],
2125
coverageDirectory: '../coverage',
2226
testEnvironment: 'node',
@@ -37,6 +41,6 @@ module.exports = {
3741
],
3842
// Mock ES modules that cause issues
3943
moduleNameMapper: {
40-
'^uuid$': '<rootDir>/../__mocks__/uuid.js',
44+
'^uuid$': '<rootDir>/shared/__mocks__/uuid.js',
4145
},
42-
};
46+
};

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@
8484
"winston-daily-rotate-file": "^5.0.0",
8585
"winston-elasticsearch": "^0.19.0",
8686
"winston-loki": "^6.1.3",
87-
"winston-transport": "^4.9.0"
87+
"winston-transport": "^4.9.0",
88+
"yaml": "^2.8.2"
8889
},
8990
"devDependencies": {
9091
"@eslint/js": "^9.39.2",

pnpm-lock.yaml

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scripts/generate-secrets.js

Lines changed: 155 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,91 @@
11
#!/usr/bin/env node
22

33
/**
4-
* Generate Secure Secrets for TelemetryFlow Core
5-
*
4+
* Generate Secure Secrets for TelemetryFlow SDK
5+
*
66
* Usage:
7-
* node scripts/generate-secrets.js
8-
* node scripts/generate-secrets.js --length 64
9-
* node scripts/generate-secrets.js --format hex
7+
* node scripts/generate-secrets.js # Generate all secrets
8+
* node scripts/generate-secrets.js --api-keys # Generate only API keys
9+
* node scripts/generate-secrets.js --jwt # Generate only JWT secrets
10+
* node scripts/generate-secrets.js --length 64 # Custom length
11+
* node scripts/generate-secrets.js --format hex # Custom format
12+
* node scripts/generate-secrets.js --env # Output as .env format only
1013
*/
1114

1215
const crypto = require('crypto');
1316

17+
// Parse arguments
1418
const args = process.argv.slice(2);
1519
let length = 32;
1620
let format = 'base64';
21+
let generateApiKeys = true;
22+
let generateJwtSecrets = true;
23+
let envOnly = false;
1724

1825
for (let i = 0; i < args.length; i++) {
19-
if (args[i] === '--length' && args[i + 1]) {
20-
length = parseInt(args[i + 1]);
21-
i++;
22-
} else if (args[i] === '--format' && args[i + 1]) {
23-
format = args[i + 1];
24-
i++;
25-
} else if (args[i] === '--help' || args[i] === '-h') {
26-
console.log(`
27-
TelemetryFlow Core - Secure Secret Generator
26+
switch (args[i]) {
27+
case '--length':
28+
if (args[i + 1]) {
29+
length = parseInt(args[i + 1]);
30+
i++;
31+
}
32+
break;
33+
case '--format':
34+
if (args[i + 1]) {
35+
format = args[i + 1];
36+
i++;
37+
}
38+
break;
39+
case '--api-keys':
40+
generateApiKeys = true;
41+
generateJwtSecrets = false;
42+
break;
43+
case '--jwt':
44+
generateApiKeys = false;
45+
generateJwtSecrets = true;
46+
break;
47+
case '--env':
48+
envOnly = true;
49+
break;
50+
case '--help':
51+
case '-h':
52+
console.log(`
53+
TelemetryFlow SDK - Secure Secret Generator
2854
2955
Usage:
3056
node scripts/generate-secrets.js [options]
3157
3258
Options:
3359
--length <number> Length in bytes (default: 32)
3460
--format <format> Output format: base64, hex, base64url (default: base64)
61+
--api-keys Generate only TelemetryFlow API keys
62+
--jwt Generate only JWT/Session secrets
63+
--env Output in .env format only (no decorations)
3564
--help, -h Show this help
3665
3766
Examples:
38-
node scripts/generate-secrets.js
39-
node scripts/generate-secrets.js --length 64
40-
node scripts/generate-secrets.js --format hex
67+
node scripts/generate-secrets.js # Generate all secrets
68+
node scripts/generate-secrets.js --api-keys # API keys only
69+
node scripts/generate-secrets.js --jwt --length 64 # JWT with 64 bytes
70+
node scripts/generate-secrets.js --env # .env format output
4171
`);
42-
process.exit(0);
72+
process.exit(0);
4373
}
4474
}
4575

76+
// Validation
4677
if (length < 32) {
47-
console.error('Error: Length must be at least 32 bytes');
78+
console.error('Error: Length must be at least 32 bytes');
4879
process.exit(1);
4980
}
5081

5182
const validFormats = ['base64', 'hex', 'base64url'];
5283
if (!validFormats.includes(format)) {
53-
console.error(`Error: Format must be one of: ${validFormats.join(', ')}`);
84+
console.error(`Error: Format must be one of: ${validFormats.join(', ')}`);
5485
process.exit(1);
5586
}
5687

88+
// Secret generation functions
5789
function generateSecret(bytes, encoding) {
5890
const buffer = crypto.randomBytes(bytes);
5991
if (encoding === 'base64url') {
@@ -65,38 +97,108 @@ function generateSecret(bytes, encoding) {
6597
return buffer.toString(encoding);
6698
}
6799

68-
const jwtSecret = generateSecret(length, format);
69-
const sessionSecret = generateSecret(length, format);
70-
71-
console.log('\n🔐 TelemetryFlow Core - Secret Generator');
72-
console.log('=========================================');
73-
console.log(`Length: ${length} bytes | Format: ${format}\n`);
74-
75-
console.log('Generated Secrets:');
76-
console.log('------------------\n');
77-
console.log('JWT_SECRET:');
78-
console.log(` ${jwtSecret}\n`);
79-
console.log('SESSION_SECRET:');
80-
console.log(` ${sessionSecret}\n`);
81-
82-
console.log('.env Format:');
83-
console.log('------------');
84-
console.log(`JWT_SECRET=${jwtSecret}`);
85-
console.log(`JWT_EXPIRES_IN=24h`);
86-
console.log(`SESSION_SECRET=${sessionSecret}\n`);
87-
88-
console.log('Docker Example:');
89-
console.log('---------------');
90-
console.log(`docker run -d \\
91-
-e JWT_SECRET="${jwtSecret}" \\
92-
-e SESSION_SECRET="${sessionSecret}" \\
93-
telemetryflow-core:latest\n`);
94-
95-
console.log('Security Tips:');
96-
console.log('--------------');
97-
console.log('✓ Never commit secrets to git');
98-
console.log('✓ Use different secrets per environment');
99-
console.log('✓ Rotate secrets every 90 days');
100-
console.log('✓ Store in secrets manager (AWS Secrets Manager, etc.)\n');
100+
function generateHexString(length) {
101+
return crypto.randomBytes(Math.ceil(length / 2)).toString('hex').slice(0, length);
102+
}
103+
104+
function generateApiKeyId() {
105+
return `tfk_${generateHexString(32)}`;
106+
}
107+
108+
function generateApiKeySecret() {
109+
return `tfs_${generateHexString(64)}`;
110+
}
111+
112+
// Generate secrets
113+
const secrets = {};
114+
115+
if (generateApiKeys) {
116+
secrets.TELEMETRYFLOW_API_KEY_ID = generateApiKeyId();
117+
secrets.TELEMETRYFLOW_API_KEY_SECRET = generateApiKeySecret();
118+
}
119+
120+
if (generateJwtSecrets) {
121+
secrets.JWT_SECRET = generateSecret(length, format);
122+
secrets.JWT_REFRESH_SECRET = generateSecret(length, format);
123+
secrets.SESSION_SECRET = generateSecret(length, format);
124+
}
125+
126+
// Output
127+
if (envOnly) {
128+
// Simple .env format output
129+
if (generateApiKeys) {
130+
console.log('# TelemetryFlow API Keys');
131+
console.log(`TELEMETRYFLOW_API_KEY_ID=${secrets.TELEMETRYFLOW_API_KEY_ID}`);
132+
console.log(`TELEMETRYFLOW_API_KEY_SECRET=${secrets.TELEMETRYFLOW_API_KEY_SECRET}`);
133+
}
134+
if (generateJwtSecrets) {
135+
if (generateApiKeys) console.log('');
136+
console.log('# JWT & Session Secrets');
137+
console.log(`JWT_SECRET=${secrets.JWT_SECRET}`);
138+
console.log(`JWT_REFRESH_SECRET=${secrets.JWT_REFRESH_SECRET}`);
139+
console.log(`JWT_EXPIRATION=24h`);
140+
console.log(`JWT_REFRESH_EXPIRATION=168h`);
141+
console.log(`SESSION_SECRET=${secrets.SESSION_SECRET}`);
142+
}
143+
} else {
144+
// Decorated output
145+
console.log('\n=============================================');
146+
console.log(' TelemetryFlow SDK - Secret Generator');
147+
console.log('=============================================\n');
148+
149+
if (generateApiKeys) {
150+
console.log('TelemetryFlow API Keys:');
151+
console.log('-----------------------');
152+
console.log(` API Key ID: ${secrets.TELEMETRYFLOW_API_KEY_ID}`);
153+
console.log(` API Key Secret: ${secrets.TELEMETRYFLOW_API_KEY_SECRET}`);
154+
console.log('');
155+
}
156+
157+
if (generateJwtSecrets) {
158+
console.log(`JWT & Session Secrets (${length} bytes, ${format}):`)
159+
console.log('----------------------------------------------');
160+
console.log(` JWT Secret: ${secrets.JWT_SECRET}`);
161+
console.log(` JWT Refresh Secret: ${secrets.JWT_REFRESH_SECRET}`);
162+
console.log(` Session Secret: ${secrets.SESSION_SECRET}`);
163+
console.log('');
164+
}
165+
166+
console.log('.env Format:');
167+
console.log('------------');
168+
if (generateApiKeys) {
169+
console.log(`TELEMETRYFLOW_API_KEY_ID=${secrets.TELEMETRYFLOW_API_KEY_ID}`);
170+
console.log(`TELEMETRYFLOW_API_KEY_SECRET=${secrets.TELEMETRYFLOW_API_KEY_SECRET}`);
171+
}
172+
if (generateJwtSecrets) {
173+
console.log(`JWT_SECRET=${secrets.JWT_SECRET}`);
174+
console.log(`JWT_REFRESH_SECRET=${secrets.JWT_REFRESH_SECRET}`);
175+
console.log(`JWT_EXPIRATION=24h`);
176+
console.log(`JWT_REFRESH_EXPIRATION=168h`);
177+
console.log(`SESSION_SECRET=${secrets.SESSION_SECRET}`);
178+
}
179+
console.log('');
180+
181+
console.log('Docker Example:');
182+
console.log('---------------');
183+
const dockerEnvs = [];
184+
if (generateApiKeys) {
185+
dockerEnvs.push(` -e TELEMETRYFLOW_API_KEY_ID="${secrets.TELEMETRYFLOW_API_KEY_ID}"`);
186+
dockerEnvs.push(` -e TELEMETRYFLOW_API_KEY_SECRET="${secrets.TELEMETRYFLOW_API_KEY_SECRET}"`);
187+
}
188+
if (generateJwtSecrets) {
189+
dockerEnvs.push(` -e JWT_SECRET="${secrets.JWT_SECRET}"`);
190+
dockerEnvs.push(` -e SESSION_SECRET="${secrets.SESSION_SECRET}"`);
191+
}
192+
console.log(`docker run -d \\\n${dockerEnvs.join(' \\\n')} \\`);
193+
console.log(' TelemetryFlow SDK:latest\n');
194+
195+
console.log('Security Tips:');
196+
console.log('--------------');
197+
console.log('- Never commit secrets to git');
198+
console.log('- Use different secrets per environment');
199+
console.log('- Rotate secrets every 90 days');
200+
console.log('- Store in secrets manager (AWS Secrets Manager, HashiCorp Vault, etc.)');
201+
console.log('');
202+
}
101203

102204
process.exit(0);

tsconfig.build.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"scripts",
88
"**/*spec.ts",
99
"**/*.e2e.spec.ts",
10-
"**/__tests__/**"
10+
"**/__tests__/**",
11+
"src/standardization/**/*"
1112
]
1213
}

0 commit comments

Comments
 (0)