11import { execSync } from "node:child_process" ;
2- import { appendFileSync , writeFileSync } from "fs" ;
3- import { join , dirname } from "path" ;
4- import { fileURLToPath } from "url" ;
2+ import { appendFileSync , writeFileSync } from "node: fs" ;
3+ import { join , dirname } from "node: path" ;
4+ import { fileURLToPath } from "node: url" ;
55import dotenv from "dotenv" ;
66import { Vercel } from "@vercel/sdk" ;
77
88const __dirname = dirname ( fileURLToPath ( import . meta. url ) ) ;
99const projectRoot = join ( __dirname , ".." ) ;
10+ const baseParams : Record < string , string > = { } ;
1011
11- if ( process . env . HOME === "/vercel" ) process . exit ( 0 ) ;
12-
13- dotenv . config ( ) ;
14-
15- const variant =
16- ( process . argv . length === 3
17- ? process . argv [ 2 ]
18- : process . env [ "SUPABASE_USE_DB" ] ) || "local" ;
19-
20- if ( [ "local" , "branch" , "production" , "all" ] . indexOf ( variant ) === - 1 ) {
21- console . error ( "Invalid variant: " + variant ) ;
22- process . exit ( - 1 ) ;
12+ enum Variant {
13+ local = "local" ,
14+ branch = "branch" ,
15+ production = "production" ,
16+ all = "all" ,
17+ none = "none" ,
2318}
2419
2520// option to override in .env, but otherwise use our values
2621const projectIdOrName : string =
2722 process . env [ "VERCEL_PROJECT_ID" ] ||
2823 process . env [ "VERCEL_PROJECT_NAME" ] ||
2924 "discourse-graph" ;
30- const baseParams : Record < string , string > = { } ;
31- const vercelToken = process . env [ "VERCEL_TOKEN" ] ;
25+
26+ const getVercelToken = ( ) => {
27+ dotenv . config ( ) ;
28+ return process . env [ "VERCEL_TOKEN" ] ;
29+ } ;
3230
3331const makeLocalEnv = ( ) => {
3432 const stdout = execSync ( "supabase status -o env" , {
@@ -49,7 +47,7 @@ const makeLocalEnv = () => {
4947 ) ;
5048} ;
5149
52- const makeBranchEnv = async ( vercel : Vercel ) => {
50+ const makeBranchEnv = async ( vercel : Vercel , vercelToken : string ) => {
5351 let branch : string ;
5452 if ( process . env . SUPABASE_GIT_BRANCH ) {
5553 // allow to override current branch
@@ -88,7 +86,7 @@ const makeBranchEnv = async (vercel: Vercel) => {
8886 appendFileSync ( ".env.branch" , `NEXT_API_ROOT="${ url } /api"\n` ) ;
8987} ;
9088
91- const makeProductionEnv = async ( vercel : Vercel ) => {
89+ const makeProductionEnv = async ( vercel : Vercel , vercelToken : string ) => {
9290 const result = await vercel . deployments . getDeployments ( {
9391 ...baseParams ,
9492 projectId : projectIdOrName ,
@@ -100,38 +98,62 @@ const makeProductionEnv = async (vercel: Vercel) => {
10098 throw new Error ( "No production deployment found" ) ;
10199 }
102100 const url = result . deployments [ 0 ] ! . url ;
103- console . log ( url ) ;
104101 execSync (
105102 `vercel -t ${ vercelToken } env pull --environment production .env.production` ,
106103 ) ;
107104 appendFileSync ( ".env.production" , `NEXT_API_ROOT="${ url } /api"\n` ) ;
108105} ;
109106
110- try {
111- if ( variant === "local" || variant === "all" ) {
112- makeLocalEnv ( ) ;
113- if ( variant === "local" ) process . exit ( 0 ) ;
114- }
115- if ( ! vercelToken ) {
116- console . error ( "Missing VERCEL_TOKEN in .env" ) ;
117- process . exit ( - 1 ) ;
118- }
119- // option to override in .env, but otherwise use our values
120- const teamId = process . env [ "VERCEL_TEAM_ID" ] ;
121- const teamSlug = process . env [ "VERCEL_TEAM_SLUG" ] || "discourse-graphs" ;
122- if ( teamId ) {
123- baseParams . teamId = teamId ;
124- } else {
125- baseParams . slug = teamSlug ;
126- }
127- const vercel = new Vercel ( { bearerToken : vercelToken } ) ;
128- if ( variant === "branch" || variant === "all" ) {
129- await makeBranchEnv ( vercel ) ;
107+ const main = async ( variant : Variant ) => {
108+ // Do not execute in deployment or github action.
109+ if (
110+ process . env . HOME === "/vercel" ||
111+ process . env . GITHUB_ACTIONS !== undefined
112+ )
113+ return ;
114+
115+ if ( variant === Variant . none ) return ;
116+
117+ try {
118+ if ( variant === Variant . local || variant === Variant . all ) {
119+ makeLocalEnv ( ) ;
120+ if ( variant === Variant . local ) return ;
121+ }
122+ const vercelToken = getVercelToken ( ) ;
123+ if ( ! vercelToken ) {
124+ throw Error ( "Missing VERCEL_TOKEN in .env" ) ;
125+ }
126+ // option to override in .env, but otherwise use our values
127+ const teamId = process . env [ "VERCEL_TEAM_ID" ] ;
128+ const teamSlug = process . env [ "VERCEL_TEAM_SLUG" ] || "discourse-graphs" ;
129+ if ( teamId ) {
130+ baseParams . teamId = teamId ;
131+ } else {
132+ baseParams . slug = teamSlug ;
133+ }
134+ const vercel = new Vercel ( { bearerToken : vercelToken } ) ;
135+ if ( variant === Variant . branch || variant === Variant . all ) {
136+ await makeBranchEnv ( vercel , vercelToken ) ;
137+ }
138+ if ( variant === Variant . production || variant === Variant . all ) {
139+ await makeProductionEnv ( vercel , vercelToken ) ;
140+ }
141+ } catch ( err ) {
142+ console . error ( "variant " , variant , " error " , err ) ;
143+ throw err ;
130144 }
131- if ( variant === "production" || variant === "all" ) {
132- await makeProductionEnv ( vercel ) ;
145+ } ;
146+
147+ if ( fileURLToPath ( import . meta. url ) === process . argv [ 1 ] ) {
148+ const variantS : string =
149+ ( process . argv . length === 3
150+ ? process . argv [ 2 ]
151+ : process . env [ "SUPABASE_USE_DB" ] ) || "none" ;
152+
153+ const variant = ( Variant as Record < string , Variant > ) [ variantS ] ;
154+ if ( variant === undefined ) {
155+ throw Error ( "Invalid variant: " + variant ) ;
133156 }
134- } catch ( err ) {
135- console . error ( err ) ;
136- throw err ;
157+ console . log ( variant ) ;
158+ await main ( variant ) ;
137159}
0 commit comments