@@ -93,6 +93,17 @@ strip_quotes() {
9393 echo " $s "
9494}
9595
96+ set_sql_url () {
97+ local value=" $1 "
98+ local label=" $2 "
99+ local cleaned
100+ cleaned=" $( strip_quotes " $value " ) "
101+ if [[ -z " $SQL_URL " && -n " $cleaned " ]]; then
102+ SQL_URL=" $cleaned "
103+ SQL_URL_SOURCE=" $label "
104+ fi
105+ }
106+
96107read_env_value () {
97108 local key=" $1 "
98109 local file=" $2 "
@@ -102,10 +113,13 @@ read_env_value() {
102113}
103114
104115SQL_URL=" "
116+ SQL_URL_SOURCE=" "
105117ENV_FILE=" "
118+ ENVIRONMENT_UPPER=" $( echo " ${ENVIRONMENT:- } " | tr ' [:lower:]' ' [:upper:]' ) "
106119
107120if [[ -n " $URL_OVERRIDE " ]]; then
108121 SQL_URL=" $( strip_quotes " $URL_OVERRIDE " ) "
122+ SQL_URL_SOURCE=" --url"
109123 ENV_FILE=" (override: --url)"
110124else
111125 if [[ " $ENVIRONMENT " != " staging" && " $ENVIRONMENT " != " prod" && " $ENVIRONMENT " != " local" ]]; then
@@ -115,37 +129,96 @@ else
115129
116130 if [[ " $ENVIRONMENT " == " staging" ]]; then
117131 ENV_FILE=" ${STAGING_ENV_FILE:- ${ENV_FILE:- $APP_DIR / .env.local} } "
132+ ENV_DIRECT_FROM_FILE=" $( read_env_value " STAGING_DIRECT_DATABASE_URL" " $ENV_FILE " ) "
118133 DIRECT_FROM_FILE=" $( read_env_value " DIRECT_DATABASE_URL" " $ENV_FILE " ) "
119134 DIRECT_ALT_FROM_FILE=" $( read_env_value " DIRECT_URL" " $ENV_FILE " ) "
120- SQL_URL=" ${STAGING_DIRECT_DATABASE_URL:- ${DIRECT_DATABASE_URL:- ${DIRECT_URL:- ${DIRECT_FROM_FILE:- $DIRECT_ALT_FROM_FILE } } } } "
135+ set_sql_url " ${STAGING_DIRECT_DATABASE_URL:- } " " STAGING_DIRECT_DATABASE_URL (env)"
136+ set_sql_url " ${DIRECT_DATABASE_URL:- } " " DIRECT_DATABASE_URL (env)"
137+ set_sql_url " ${DIRECT_URL:- } " " DIRECT_URL (env)"
138+ set_sql_url " ${ENV_DIRECT_FROM_FILE:- } " " STAGING_DIRECT_DATABASE_URL ($ENV_FILE )"
139+ set_sql_url " ${DIRECT_FROM_FILE:- } " " DIRECT_DATABASE_URL ($ENV_FILE )"
140+ set_sql_url " ${DIRECT_ALT_FROM_FILE:- } " " DIRECT_URL ($ENV_FILE )"
121141 elif [[ " $ENVIRONMENT " == " prod" ]]; then
122142 ENV_FILE=" ${PROD_ENV_FILE:- $APP_DIR / .env.prod} "
143+ if [[ ! -f " $ENV_FILE " && -z " ${PROD_DIRECT_DATABASE_URL:- } " && -z " ${DIRECT_DATABASE_URL:- } " && -z " ${DIRECT_URL:- } " ]]; then
144+ cat << EOF
145+ Error: prod env file not found: $ENV_FILE
146+
147+ Set one of the following:
148+ - Create $ENV_FILE (recommended)
149+ - Set PROD_ENV_FILE=/path/to/env
150+ - Export PROD_DIRECT_DATABASE_URL in your shell
151+ - Use --url 'postgresql://...'
152+ EOF
153+ exit 1
154+ fi
155+ ALLOW_PROD_URL=0
156+ if [[ " ${PROD_SQL_CONFIRMED:- } " == " yes" || " ${npm_lifecycle_event:- } " == " sql:prod" ]]; then
157+ ALLOW_PROD_URL=1
158+ fi
159+ if [[ " $ALLOW_PROD_URL " -eq 1 ]]; then
160+ ENV_DIRECT_FROM_FILE=" $( read_env_value " PROD_DIRECT_DATABASE_URL" " $ENV_FILE " ) "
161+ PROD_DIRECT_FROM_ENV=" ${PROD_DIRECT_DATABASE_URL:- } "
162+ else
163+ ENV_DIRECT_FROM_FILE=" "
164+ PROD_DIRECT_FROM_ENV=" "
165+ fi
123166 DIRECT_FROM_FILE=" $( read_env_value " DIRECT_DATABASE_URL" " $ENV_FILE " ) "
124167 DIRECT_ALT_FROM_FILE=" $( read_env_value " DIRECT_URL" " $ENV_FILE " ) "
125- SQL_URL=" ${PROD_DIRECT_DATABASE_URL:- ${DIRECT_DATABASE_URL:- ${DIRECT_URL:- ${DIRECT_FROM_FILE:- $DIRECT_ALT_FROM_FILE } } } } "
168+ set_sql_url " ${PROD_DIRECT_FROM_ENV:- } " " PROD_DIRECT_DATABASE_URL (env)"
169+ set_sql_url " ${DIRECT_DATABASE_URL:- } " " DIRECT_DATABASE_URL (env)"
170+ set_sql_url " ${DIRECT_URL:- } " " DIRECT_URL (env)"
171+ set_sql_url " ${ENV_DIRECT_FROM_FILE:- } " " PROD_DIRECT_DATABASE_URL ($ENV_FILE )"
172+ set_sql_url " ${DIRECT_FROM_FILE:- } " " DIRECT_DATABASE_URL ($ENV_FILE )"
173+ set_sql_url " ${DIRECT_ALT_FROM_FILE:- } " " DIRECT_URL ($ENV_FILE )"
126174 else
127175 ENV_FILE=" ${LOCAL_ENV_FILE:- ${ENV_FILE:- $APP_DIR / .env.local} } "
128176 DIRECT_FROM_FILE=" $( read_env_value " DIRECT_DATABASE_URL" " $ENV_FILE " ) "
129177 DIRECT_ALT_FROM_FILE=" $( read_env_value " DIRECT_URL" " $ENV_FILE " ) "
130- SQL_URL=" ${DIRECT_DATABASE_URL:- ${DIRECT_URL:- ${DIRECT_FROM_FILE:- $DIRECT_ALT_FROM_FILE } } } "
178+ set_sql_url " ${DIRECT_DATABASE_URL:- } " " DIRECT_DATABASE_URL (env)"
179+ set_sql_url " ${DIRECT_URL:- } " " DIRECT_URL (env)"
180+ set_sql_url " ${DIRECT_FROM_FILE:- } " " DIRECT_DATABASE_URL ($ENV_FILE )"
181+ set_sql_url " ${DIRECT_ALT_FROM_FILE:- } " " DIRECT_URL ($ENV_FILE )"
131182 fi
132-
133- SQL_URL=" $( strip_quotes " ${SQL_URL:- } " ) "
134183fi
135184
136185if [[ -z " $SQL_URL " ]]; then
137186 cat << EOF
138187No database URL found.
139188
140189Set one of the following:
190+ - ${ENVIRONMENT_UPPER} _DIRECT_DATABASE_URL in $ENV_FILE
141191 - DIRECT_DATABASE_URL in $ENV_FILE
142192 - DIRECT_URL in $ENV_FILE
143- - ${ENVIRONMENT^^ } _DIRECT_DATABASE_URL in your shell
193+ - ${ENVIRONMENT_UPPER } _DIRECT_DATABASE_URL in your shell
144194 - Use --url 'postgresql://...'
145195EOF
196+ if [[ " $ENVIRONMENT " == " prod" && " ${ALLOW_PROD_URL:- 0} " -eq 0 ]]; then
197+ echo
198+ echo " Note: PROD_DIRECT_DATABASE_URL is only read when running via 'pnpm sql:prod' (or with PROD_SQL_CONFIRMED=yes)."
199+ fi
200+ exit 1
201+ fi
202+
203+ if [[ " $SQL_URL " == = * ]]; then
204+ echo " Error: invalid database URL (starts with '='). Check for a double '=' in your env file."
146205 exit 1
147206fi
148207
208+ if [[ " $SQL_URL " =~ [[:space:]] ]]; then
209+ echo " Error: invalid database URL (contains whitespace)."
210+ exit 1
211+ fi
212+
213+ case " $SQL_URL " in
214+ postgres://* |postgresql://* )
215+ ;;
216+ * )
217+ echo " Error: invalid database URL (expected postgres:// or postgresql://)."
218+ exit 1
219+ ;;
220+ esac
221+
149222if [[ " $ENVIRONMENT " == " prod" && " $DRY_RUN " -eq 0 ]]; then
150223 if [[ " ${PROD_SQL_CONFIRMED:- } " != " yes" ]]; then
151224 cat << 'EOF '
@@ -193,6 +266,11 @@ if [[ "$DRY_RUN" -eq 1 ]]; then
193266 echo " Environment: $ENVIRONMENT "
194267 echo " Script: $SCRIPT_PATH "
195268 echo " Env file: $ENV_FILE "
269+ if [[ -n " $SQL_URL_SOURCE " ]]; then
270+ echo " URL source: $SQL_URL_SOURCE "
271+ else
272+ echo " URL source: (unknown)"
273+ fi
196274 if [[ " ${VAR_KEYS[*]-} " != " " ]]; then
197275 echo " Vars: ${VAR_KEYS[*]} "
198276 else
0 commit comments