@@ -3,141 +3,140 @@ import fs from "fs";
3
3
import chalk from "chalk" ;
4
4
5
5
export const generateEnv = ( envValues ) => {
6
- let isDockerCompose = envValues . runOption === "docker-compose" ;
7
- let dbPort = isDockerCompose ? 3307 : 3306 ;
8
- let platformUrl = isDockerCompose
9
- ? "http://host.docker.internal:8000"
10
- : "http://localhost:8000" ;
11
-
12
- const envDefinition = getEnvDefinition (
13
- envValues ,
14
- isDockerCompose ,
15
- dbPort ,
16
- platformUrl ,
17
- ) ;
18
-
19
- const envFileContent = generateEnvFileContent ( envDefinition ) ;
20
- saveEnvFile ( envFileContent ) ;
6
+ let isDockerCompose = envValues . runOption === "docker-compose" ;
7
+ let dbPort = isDockerCompose ? 3307 : 3306 ;
8
+ let platformUrl = isDockerCompose
9
+ ? "http://host.docker.internal:8000"
10
+ : "http://localhost:8000" ;
11
+
12
+ const envDefinition = getEnvDefinition (
13
+ envValues ,
14
+ isDockerCompose ,
15
+ dbPort ,
16
+ platformUrl
17
+ ) ;
18
+
19
+ const envFileContent = generateEnvFileContent ( envDefinition ) ;
20
+ saveEnvFile ( envFileContent ) ;
21
21
} ;
22
22
23
23
const getEnvDefinition = ( envValues , isDockerCompose , dbPort , platformUrl ) => {
24
- return {
25
- "Deployment Environment" : {
26
- NODE_ENV : "development" ,
27
- NEXT_PUBLIC_VERCEL_ENV : "${NODE_ENV}" ,
28
- } ,
29
- NextJS : {
30
- NEXT_PUBLIC_BACKEND_URL : "http://localhost:8000" ,
31
- NEXT_PUBLIC_MAX_LOOPS : 100 ,
32
- } ,
33
- "Next Auth config" : {
34
- NEXTAUTH_SECRET : generateAuthSecret ( ) ,
35
- NEXTAUTH_URL : "http://localhost:3000" ,
36
- } ,
37
- "Auth providers (Use if you want to get out of development mode sign-in)" : {
38
- GOOGLE_CLIENT_ID : "***" ,
39
- GOOGLE_CLIENT_SECRET : "***" ,
40
- GITHUB_CLIENT_ID : "***" ,
41
- GITHUB_CLIENT_SECRET : "***" ,
42
- DISCORD_CLIENT_SECRET : "***" ,
43
- DISCORD_CLIENT_ID : "***" ,
44
- } ,
45
- Backend : {
46
- REWORKD_PLATFORM_ENVIRONMENT : "${NODE_ENV}" ,
47
- REWORKD_PLATFORM_FF_MOCK_MODE_ENABLED : false ,
48
- REWORKD_PLATFORM_MAX_LOOPS : "${NEXT_PUBLIC_MAX_LOOPS}" ,
49
- REWORKD_PLATFORM_OPENAI_API_KEY :
50
- envValues . OpenAIApiKey || '"<change me>"' ,
51
- REWORKD_PLATFORM_FRONTEND_URL : "http://localhost:3000" ,
52
- REWORKD_PLATFORM_RELOAD : true ,
53
- REWORKD_PLATFORM_OPENAI_API_BASE : "https://api.openai.com/v1" ,
54
- REWORKD_PLATFORM_SERP_API_KEY : envValues . serpApiKey || '""' ,
55
- REWORKD_PLATFORM_REPLICATE_API_KEY : envValues . replicateApiKey || '""' ,
56
- } ,
57
- "Database (Backend)" : {
58
- REWORKD_PLATFORM_DATABASE_USER : "reworkd_platform" ,
59
- REWORKD_PLATFORM_DATABASE_PASSWORD : "reworkd_platform" ,
60
- REWORKD_PLATFORM_DATABASE_HOST : "db" ,
61
- REWORKD_PLATFORM_DATABASE_PORT : dbPort ,
62
- REWORKD_PLATFORM_DATABASE_NAME : "reworkd_platform" ,
63
- REWORKD_PLATFORM_DATABASE_URL :
64
- "mysql://${REWORKD_PLATFORM_DATABASE_USER}:${REWORKD_PLATFORM_DATABASE_PASSWORD}@${REWORKD_PLATFORM_DATABASE_HOST}:${REWORKD_PLATFORM_DATABASE_PORT}/${REWORKD_PLATFORM_DATABASE_NAME}" ,
65
- REWORKD_PLATFORM_DB_CA_PATH : isDockerCompose ? "/etc/ssl/certs/ca-certificates.crt" : "" ,
66
- } ,
67
- "Database (Frontend)" : {
68
- DATABASE_USER : "reworkd_platform" ,
69
- DATABASE_PASSWORD : "reworkd_platform" ,
70
- DATABASE_HOST : "db" ,
71
- DATABASE_PORT : dbPort ,
72
- DATABASE_NAME : "reworkd_platform" ,
73
- DATABASE_URL :
74
- "mysql://${DATABASE_USER}:${DATABASE_PASSWORD}@${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}" ,
75
- } ,
76
- } ;
24
+ return {
25
+ "Deployment Environment" : {
26
+ NODE_ENV : "development" ,
27
+ NEXT_PUBLIC_VERCEL_ENV : "${NODE_ENV}" ,
28
+ } ,
29
+ NextJS : {
30
+ NEXT_PUBLIC_BACKEND_URL : "http://localhost:8000" ,
31
+ NEXT_PUBLIC_MAX_LOOPS : 100 ,
32
+ } ,
33
+ "Next Auth config" : {
34
+ NEXTAUTH_SECRET : generateAuthSecret ( ) ,
35
+ NEXTAUTH_URL : "http://localhost:3000" ,
36
+ } ,
37
+ "Auth providers (Use if you want to get out of development mode sign-in)" : {
38
+ GOOGLE_CLIENT_ID : "***" ,
39
+ GOOGLE_CLIENT_SECRET : "***" ,
40
+ GITHUB_CLIENT_ID : "***" ,
41
+ GITHUB_CLIENT_SECRET : "***" ,
42
+ DISCORD_CLIENT_SECRET : "***" ,
43
+ DISCORD_CLIENT_ID : "***" ,
44
+ } ,
45
+ Backend : {
46
+ REWORKD_PLATFORM_ENVIRONMENT : "${NODE_ENV}" ,
47
+ REWORKD_PLATFORM_FF_MOCK_MODE_ENABLED : false ,
48
+ REWORKD_PLATFORM_MAX_LOOPS : "${NEXT_PUBLIC_MAX_LOOPS}" ,
49
+ REWORKD_PLATFORM_OPENAI_API_KEY :
50
+ envValues . OpenAIApiKey || '"<change me>"' ,
51
+ REWORKD_PLATFORM_FRONTEND_URL : "http://localhost:3000" ,
52
+ REWORKD_PLATFORM_RELOAD : true ,
53
+ REWORKD_PLATFORM_OPENAI_API_BASE : "https://api.openai.com/v1" ,
54
+ REWORKD_PLATFORM_SERP_API_KEY : envValues . serpApiKey || '""' ,
55
+ REWORKD_PLATFORM_REPLICATE_API_KEY : envValues . replicateApiKey || '""' ,
56
+ } ,
57
+ "Database (Backend)" : {
58
+ REWORKD_PLATFORM_DATABASE_USER : "reworkd_platform" ,
59
+ REWORKD_PLATFORM_DATABASE_PASSWORD : "reworkd_platform" ,
60
+ REWORKD_PLATFORM_DATABASE_HOST : "db" ,
61
+ REWORKD_PLATFORM_DATABASE_PORT : dbPort ,
62
+ REWORKD_PLATFORM_DATABASE_NAME : "reworkd_platform" ,
63
+ REWORKD_PLATFORM_DATABASE_URL :
64
+ "mysql://${REWORKD_PLATFORM_DATABASE_USER}:${REWORKD_PLATFORM_DATABASE_PASSWORD}@${REWORKD_PLATFORM_DATABASE_HOST}:${REWORKD_PLATFORM_DATABASE_PORT}/${REWORKD_PLATFORM_DATABASE_NAME}" ,
65
+ } ,
66
+ "Database (Frontend)" : {
67
+ DATABASE_USER : "reworkd_platform" ,
68
+ DATABASE_PASSWORD : "reworkd_platform" ,
69
+ DATABASE_HOST : "db" ,
70
+ DATABASE_PORT : dbPort ,
71
+ DATABASE_NAME : "reworkd_platform" ,
72
+ DATABASE_URL :
73
+ "mysql://${DATABASE_USER}:${DATABASE_PASSWORD}@${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}" ,
74
+ } ,
75
+ } ;
77
76
} ;
78
77
79
78
const generateEnvFileContent = ( config ) => {
80
- let configFile = "" ;
81
-
82
- Object . entries ( config ) . forEach ( ( [ section , variables ] ) => {
83
- configFile += `# ${ section } :\n` ;
84
- Object . entries ( variables ) . forEach ( ( [ key , value ] ) => {
85
- configFile += `${ key } =${ value } \n` ;
86
- } ) ;
87
- configFile += "\n" ;
79
+ let configFile = "" ;
80
+
81
+ Object . entries ( config ) . forEach ( ( [ section , variables ] ) => {
82
+ configFile += `# ${ section } :\n` ;
83
+ Object . entries ( variables ) . forEach ( ( [ key , value ] ) => {
84
+ configFile += `${ key } =${ value } \n` ;
88
85
} ) ;
86
+ configFile += "\n" ;
87
+ } ) ;
89
88
90
- return configFile . trim ( ) ;
89
+ return configFile . trim ( ) ;
91
90
} ;
92
91
93
92
const generateAuthSecret = ( ) => {
94
- const length = 32 ;
95
- const buffer = crypto . randomBytes ( length ) ;
96
- return buffer . toString ( "base64" ) ;
93
+ const length = 32 ;
94
+ const buffer = crypto . randomBytes ( length ) ;
95
+ return buffer . toString ( "base64" ) ;
97
96
} ;
98
97
99
98
const ENV_PATH = "../next/.env" ;
100
99
const BACKEND_ENV_PATH = "../platform/.env" ;
101
100
102
101
export const doesEnvFileExist = ( ) => {
103
- return fs . existsSync ( ENV_PATH ) ;
102
+ return fs . existsSync ( ENV_PATH ) ;
104
103
} ;
105
104
106
105
// Read the existing env file, test if it is missing any keys or contains any extra keys
107
106
export const testEnvFile = ( ) => {
108
- const data = fs . readFileSync ( ENV_PATH , "utf8" ) ;
107
+ const data = fs . readFileSync ( ENV_PATH , "utf8" ) ;
109
108
110
- // Make a fake definition to compare the keys of
111
- const envDefinition = getEnvDefinition ( { } , "" , "" , "" , "" ) ;
109
+ // Make a fake definition to compare the keys of
110
+ const envDefinition = getEnvDefinition ( { } , "" , "" , "" , "" ) ;
112
111
113
- const lines = data
114
- . split ( "\n" )
115
- . filter ( ( line ) => ! line . startsWith ( "#" ) && line . trim ( ) !== "" ) ;
116
- const envKeysFromFile = lines . map ( ( line ) => line . split ( "=" ) [ 0 ] ) ;
112
+ const lines = data
113
+ . split ( "\n" )
114
+ . filter ( ( line ) => ! line . startsWith ( "#" ) && line . trim ( ) !== "" ) ;
115
+ const envKeysFromFile = lines . map ( ( line ) => line . split ( "=" ) [ 0 ] ) ;
117
116
118
- const envKeysFromDef = Object . entries ( envDefinition ) . flatMap (
119
- ( [ section , entries ] ) => Object . keys ( entries )
120
- ) ;
117
+ const envKeysFromDef = Object . entries ( envDefinition ) . flatMap (
118
+ ( [ section , entries ] ) => Object . keys ( entries )
119
+ ) ;
121
120
122
- const missingFromFile = envKeysFromDef . filter (
123
- ( key ) => ! envKeysFromFile . includes ( key )
124
- ) ;
121
+ const missingFromFile = envKeysFromDef . filter (
122
+ ( key ) => ! envKeysFromFile . includes ( key )
123
+ ) ;
124
+
125
+ if ( missingFromFile . length > 0 ) {
126
+ let errorMessage = "\nYour ./next/.env is missing the following keys:\n" ;
127
+ missingFromFile . forEach ( ( key ) => {
128
+ errorMessage += chalk . whiteBright ( `- ❌ ${ key } \n` ) ;
129
+ } ) ;
130
+ errorMessage += "\n" ;
125
131
126
- if ( missingFromFile . length > 0 ) {
127
- let errorMessage = "\nYour ./next/.env is missing the following keys:\n" ;
128
- missingFromFile . forEach ( ( key ) => {
129
- errorMessage += chalk . whiteBright ( `- ❌ ${ key } \n` ) ;
130
- } ) ;
131
- errorMessage += "\n" ;
132
-
133
- errorMessage += chalk . red (
134
- "We recommend deleting your .env file(s) and restarting this script."
135
- ) ;
136
- throw new Error ( errorMessage ) ;
137
- }
132
+ errorMessage += chalk . red (
133
+ "We recommend deleting your .env file(s) and restarting this script."
134
+ ) ;
135
+ throw new Error ( errorMessage ) ;
136
+ }
138
137
} ;
139
138
140
139
export const saveEnvFile = ( envFileContent ) => {
141
- fs . writeFileSync ( ENV_PATH , envFileContent ) ;
142
- fs . writeFileSync ( BACKEND_ENV_PATH , envFileContent ) ;
140
+ fs . writeFileSync ( ENV_PATH , envFileContent ) ;
141
+ fs . writeFileSync ( BACKEND_ENV_PATH , envFileContent ) ;
143
142
} ;
0 commit comments