|
1 | 1 | const fs = require('fs'); |
2 | | -const os = require('os'); |
3 | 2 | const path = require('path'); |
4 | 3 | const { execSync } = require('child_process'); |
5 | 4 |
|
6 | | -const formattedDate = new Date().getTime(); |
7 | | -const commitHash = execSync('git rev-parse --short HEAD').toString().trim(); |
8 | | -const buildType = process.argv[2] || 'Beta'; |
| 5 | +function parseArgs(argv) { |
| 6 | + const out = {}; |
9 | 7 |
|
10 | | -const newEnvVars = [ |
11 | | - `BUILD_TYPE=${buildType}`, |
12 | | - `GIT_HASH=${commitHash}`, |
13 | | - `RELEASE_DATE=${formattedDate}`, |
14 | | - `NODE_ENV=${buildType === 'Release' ? 'production' : 'development'}`, |
15 | | -].join(os.EOL); |
| 8 | + for (let i = 2; i < argv.length; i += 1) { |
| 9 | + const token = argv[i]; |
16 | 10 |
|
17 | | -const envFilePath = path.join(__dirname, '..', '.env'); |
18 | | -let existingEnvData = ''; |
| 11 | + if (!token.startsWith('--')) { |
| 12 | + continue; |
| 13 | + } |
19 | 14 |
|
20 | | -try { |
21 | | - if (fs.existsSync(envFilePath)) { |
22 | | - const existingContent = fs.readFileSync(envFilePath, 'utf8'); |
23 | | - |
24 | | - existingEnvData = existingContent |
25 | | - .split(os.EOL) |
26 | | - .filter(line => { |
27 | | - const trimmedLine = line.trim(); |
28 | | - return ( |
29 | | - trimmedLine && |
30 | | - !trimmedLine.startsWith('BUILD_TYPE=') && |
31 | | - !trimmedLine.startsWith('GIT_HASH=') && |
32 | | - !trimmedLine.startsWith('RELEASE_DATE=') && |
33 | | - !trimmedLine.startsWith('NODE_ENV=') |
34 | | - ); |
35 | | - }) |
36 | | - .join(os.EOL); |
| 15 | + const eqIndex = token.indexOf('='); |
| 16 | + |
| 17 | + if (eqIndex !== -1) { |
| 18 | + out[token.slice(2, eqIndex)] = token.slice(eqIndex + 1); |
| 19 | + continue; |
| 20 | + } |
| 21 | + |
| 22 | + const key = token.slice(2); |
| 23 | + const next = argv[i + 1]; |
| 24 | + |
| 25 | + if (next && !next.startsWith('--')) { |
| 26 | + out[key] = next; |
| 27 | + i += 1; |
| 28 | + } else { |
| 29 | + out[key] = true; |
| 30 | + } |
37 | 31 | } |
38 | | -} catch (err) { |
39 | | - console.warn('Warning: Could not read existing .env file:', err.message); |
| 32 | + |
| 33 | + return out; |
40 | 34 | } |
41 | 35 |
|
42 | | -const finalContent = existingEnvData |
43 | | - ? `${newEnvVars}${os.EOL}${existingEnvData}${os.EOL}` |
44 | | - : `${newEnvVars}${os.EOL}`; |
| 36 | +function formatUtcDate(date) { |
| 37 | + const pad = n => String(n).padStart(2, '0'); |
| 38 | + |
| 39 | + const day = pad(date.getUTCDate()); |
| 40 | + const month = pad(date.getUTCMonth() + 1); |
| 41 | + const year = String(date.getUTCFullYear()).slice(-2); |
| 42 | + |
| 43 | + let hours = date.getUTCHours(); |
| 44 | + const minutes = pad(date.getUTCMinutes()); |
| 45 | + const ampm = hours >= 12 ? 'PM' : 'AM'; |
| 46 | + |
| 47 | + hours %= 12; |
| 48 | + if (hours === 0) { |
| 49 | + hours = 12; |
| 50 | + } |
| 51 | + |
| 52 | + return `${day}/${month}/${year} ${pad(hours)}:${minutes} ${ampm} UTC`; |
| 53 | +} |
| 54 | + |
| 55 | +function getGitHash() { |
| 56 | + return execSync('git rev-parse --short HEAD').toString().trim(); |
| 57 | +} |
| 58 | + |
| 59 | +const args = parseArgs(process.argv); |
| 60 | + |
| 61 | +const buildType = args['build-type'] || 'Beta'; |
| 62 | +const myanimelistClientId = args['myanimelist-client-id']; |
| 63 | +const anilistClientId = args['anilist-client-id']; |
| 64 | + |
| 65 | +const gitHash = args['git-hash'] || getGitHash(); |
| 66 | +const releaseDate = args['release-date'] || formatUtcDate(new Date()); |
| 67 | +const nodeEnv = |
| 68 | + args['node-env'] || |
| 69 | + (buildType.toLowerCase().includes('release') ? 'production' : 'development'); |
| 70 | +const testValue = |
| 71 | + args.test || 'This is a test variable to verify .env generation'; |
| 72 | + |
| 73 | +const envContent = [ |
| 74 | + `BUILD_TYPE=${JSON.stringify(buildType)}`, |
| 75 | + `GIT_HASH=${JSON.stringify(gitHash)}`, |
| 76 | + `RELEASE_DATE=${JSON.stringify(releaseDate)}`, |
| 77 | + `NODE_ENV=${JSON.stringify(nodeEnv)}`, |
| 78 | + `MYANIMELIST_CLIENT_ID=${JSON.stringify(myanimelistClientId)}`, |
| 79 | + `ANILIST_CLIENT_ID=${JSON.stringify(anilistClientId)}`, |
| 80 | + `TEST=${JSON.stringify(testValue)}`, |
| 81 | + '', |
| 82 | +].join('\n'); |
| 83 | + |
| 84 | +const envFilePath = path.join(__dirname, '..', '.env'); |
| 85 | +const buildInfoPath = path.join( |
| 86 | + __dirname, |
| 87 | + '..', |
| 88 | + 'src', |
| 89 | + 'generated', |
| 90 | + 'build-info.ts', |
| 91 | +); |
| 92 | + |
| 93 | +const buildInfoContent = `// This file is generated. Do not edit manually. |
| 94 | +export const BUILD_TYPE = ${JSON.stringify(buildType)}; |
| 95 | +export const GIT_HASH = ${JSON.stringify(gitHash)}; |
| 96 | +export const RELEASE_DATE = ${JSON.stringify(releaseDate)}; |
| 97 | +export const NODE_ENV = ${JSON.stringify(nodeEnv)}; |
| 98 | +export const MYANIMELIST_CLIENT_ID = ${JSON.stringify(myanimelistClientId)}; |
| 99 | +export const ANILIST_CLIENT_ID = ${JSON.stringify(anilistClientId)}; |
| 100 | +export const TEST = ${JSON.stringify(testValue)}; |
| 101 | +
|
| 102 | +export default { |
| 103 | + BUILD_TYPE, |
| 104 | + GIT_HASH, |
| 105 | + RELEASE_DATE, |
| 106 | + NODE_ENV, |
| 107 | + MYANIMELIST_CLIENT_ID, |
| 108 | + ANILIST_CLIENT_ID, |
| 109 | + TEST, |
| 110 | +}; |
| 111 | +`; |
45 | 112 |
|
46 | 113 | try { |
47 | | - fs.writeFileSync(envFilePath, finalContent, 'utf8'); |
| 114 | + fs.mkdirSync(path.dirname(buildInfoPath), { recursive: true }); |
| 115 | + fs.writeFileSync(buildInfoPath, buildInfoContent, 'utf8'); |
| 116 | + fs.writeFileSync(envFilePath, envContent, 'utf8'); |
48 | 117 |
|
49 | | - console.log(`Generated .env file for ${buildType} build\n`); |
| 118 | + console.log(`Generated .env for ${buildType} build`); |
50 | 119 | console.table({ |
51 | 120 | BUILD_TYPE: buildType, |
52 | | - GIT_HASH: commitHash, |
53 | | - RELEASE_DATE: formattedDate, |
54 | | - NODE_ENV: buildType === 'Release' ? 'production' : 'development', |
| 121 | + GIT_HASH: gitHash, |
| 122 | + RELEASE_DATE: releaseDate, |
| 123 | + NODE_ENV: nodeEnv, |
55 | 124 | }); |
56 | | - console.log('\n'); |
57 | 125 | } catch (err) { |
58 | 126 | console.error('Error: Could not write .env file:', err.message); |
59 | 127 | process.exit(1); |
|
0 commit comments