Skip to content

Commit 98e1ea0

Browse files
authored
Merge branch 'develop' into fix/ir
2 parents 43c38e4 + 3db642a commit 98e1ea0

20 files changed

Lines changed: 192 additions & 90 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ jobs:
8989

9090
link:
9191
name: Link
92+
if: ${{ !github.event.pull_request.head.repo.fork }}
9293
runs-on: ubuntu-latest
9394
steps:
9495
- uses: actions/checkout@v6

cmd/login.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ var (
4242
PostRunE: func(cmd *cobra.Command, args []string) error {
4343
if prof := viper.GetString("PROFILE"); viper.IsSet("PROFILE") {
4444
// Failure to save should block subsequent commands on CI
45-
return utils.WriteFile(utils.ProfilePath, []byte(prof), afero.NewOsFs())
45+
return utils.SaveProfileName(prof, afero.NewOsFs())
4646
}
4747
return nil
4848
},

cmd/projects.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ var (
4949
string(api.V1CreateProjectBodyDesiredInstanceSizeN48xlargeOptimizedMemory),
5050
string(api.V1CreateProjectBodyDesiredInstanceSizeN4xlarge),
5151
string(api.V1CreateProjectBodyDesiredInstanceSizeN8xlarge),
52-
string(api.V1CreateProjectBodyDesiredInstanceSizePico),
5352
string(api.V1CreateProjectBodyDesiredInstanceSizeSmall),
5453
string(api.V1CreateProjectBodyDesiredInstanceSizeXlarge),
5554
},

docs/supabase/db/dump.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,12 @@ Requires your local project to be linked to a remote database by running `supaba
77
Runs `pg_dump` in a container with additional flags to exclude Supabase managed schemas. The ignored schemas include auth, storage, and those created by extensions.
88

99
The default dump does not contain any data or custom roles. To dump those contents explicitly, specify either the `--data-only` and `--role-only` flag.
10+
11+
### Note on Privilege Migration
12+
13+
When restoring to a new project, tables inherit ALL privileges from default privileges in the target database. To preserve specific privileges from your dump, revoke defaults before restoring:
14+
15+
```sql
16+
-- Run BEFORE restoring your schema
17+
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON TABLES FROM anon, authenticated;
18+
```

go.mod

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ require (
4242
github.com/multigres/multigres v0.0.0-20260126223308-f5a52171bbc4
4343
github.com/oapi-codegen/nullable v1.1.0
4444
github.com/olekukonko/tablewriter v1.1.3
45-
github.com/slack-go/slack v0.18.0
45+
github.com/slack-go/slack v0.19.0
4646
github.com/spf13/afero v1.15.0
4747
github.com/spf13/cobra v1.10.2
4848
github.com/spf13/pflag v1.0.10
@@ -53,12 +53,12 @@ require (
5353
github.com/tidwall/jsonc v0.3.2
5454
github.com/withfig/autocomplete-tools/packages/cobra v1.2.0
5555
github.com/zalando/go-keyring v0.2.6
56-
go.opentelemetry.io/otel v1.40.0
56+
go.opentelemetry.io/otel v1.42.0
5757
golang.org/x/mod v0.33.0
5858
golang.org/x/net v0.51.0
59-
golang.org/x/oauth2 v0.35.0
59+
golang.org/x/oauth2 v0.36.0
6060
golang.org/x/term v0.40.0
61-
google.golang.org/grpc v1.79.1
61+
google.golang.org/grpc v1.79.2
6262
gopkg.in/yaml.v3 v3.0.1
6363
)
6464

@@ -417,10 +417,10 @@ require (
417417
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 // indirect
418418
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.39.0 // indirect
419419
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0 // indirect
420-
go.opentelemetry.io/otel/metric v1.40.0 // indirect
420+
go.opentelemetry.io/otel/metric v1.42.0 // indirect
421421
go.opentelemetry.io/otel/sdk v1.40.0 // indirect
422422
go.opentelemetry.io/otel/sdk/metric v1.40.0 // indirect
423-
go.opentelemetry.io/otel/trace v1.40.0 // indirect
423+
go.opentelemetry.io/otel/trace v1.42.0 // indirect
424424
go.opentelemetry.io/proto/otlp v1.9.0 // indirect
425425
go.uber.org/automaxprocs v1.6.0 // indirect
426426
go.uber.org/multierr v1.11.0 // indirect

go.sum

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,8 +1004,8 @@ github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnB
10041004
github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY=
10051005
github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA=
10061006
github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog=
1007-
github.com/slack-go/slack v0.18.0 h1:PM3IWgAoaPTnitOyfy8Unq/rk8OZLAxlBUhNLv8sbyg=
1008-
github.com/slack-go/slack v0.18.0/go.mod h1:K81UmCivcYd/5Jmz8vLBfuyoZ3B4rQC2GHVXHteXiAE=
1007+
github.com/slack-go/slack v0.19.0 h1:J8lL/nGTsIUX53HU8YxZeI3PDkA+sxZsFrI2Dew7h44=
1008+
github.com/slack-go/slack v0.19.0/go.mod h1:K81UmCivcYd/5Jmz8vLBfuyoZ3B4rQC2GHVXHteXiAE=
10091009
github.com/sonatard/noctx v0.1.0 h1:JjqOc2WN16ISWAjAk8M5ej0RfExEXtkEyExl2hLW+OM=
10101010
github.com/sonatard/noctx v0.1.0/go.mod h1:0RvBxqY8D4j9cTTTWE8ylt2vqj2EPI8fHmrxHdsaZ2c=
10111011
github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0=
@@ -1167,8 +1167,8 @@ go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.
11671167
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0/go.mod h1:CosX/aS4eHnG9D7nESYpV753l4j9q5j3SL/PUYd2lR8=
11681168
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0 h1:ssfIgGNANqpVFCndZvcuyKbl0g+UAVcbBcqGkG28H0Y=
11691169
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0/go.mod h1:GQ/474YrbE4Jx8gZ4q5I4hrhUzM6UPzyrqJYV2AqPoQ=
1170-
go.opentelemetry.io/otel v1.40.0 h1:oA5YeOcpRTXq6NN7frwmwFR0Cn3RhTVZvXsP4duvCms=
1171-
go.opentelemetry.io/otel v1.40.0/go.mod h1:IMb+uXZUKkMXdPddhwAHm6UfOwJyh4ct1ybIlV14J0g=
1170+
go.opentelemetry.io/otel v1.42.0 h1:lSQGzTgVR3+sgJDAU/7/ZMjN9Z+vUip7leaqBKy4sho=
1171+
go.opentelemetry.io/otel v1.42.0/go.mod h1:lJNsdRMxCUIWuMlVJWzecSMuNjE7dOYyWlqOXWkdqCc=
11721172
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.39.0 h1:cEf8jF6WbuGQWUVcqgyWtTR0kOOAWY1DYZ+UhvdmQPw=
11731173
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.39.0/go.mod h1:k1lzV5n5U3HkGvTCJHraTAGJ7MqsgL1wrGwTj1Isfiw=
11741174
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.39.0 h1:nKP4Z2ejtHn3yShBb+2KawiXgpn8In5cT7aO2wXuOTE=
@@ -1179,14 +1179,14 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.39.0 h1:in9O8
11791179
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.39.0/go.mod h1:Rp0EXBm5tfnv0WL+ARyO/PHBEaEAT8UUHQ6AGJcSq6c=
11801180
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0 h1:Ckwye2FpXkYgiHX7fyVrN1uA/UYd9ounqqTuSNAv0k4=
11811181
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0/go.mod h1:teIFJh5pW2y+AN7riv6IBPX2DuesS3HgP39mwOspKwU=
1182-
go.opentelemetry.io/otel/metric v1.40.0 h1:rcZe317KPftE2rstWIBitCdVp89A2HqjkxR3c11+p9g=
1183-
go.opentelemetry.io/otel/metric v1.40.0/go.mod h1:ib/crwQH7N3r5kfiBZQbwrTge743UDc7DTFVZrrXnqc=
1182+
go.opentelemetry.io/otel/metric v1.42.0 h1:2jXG+3oZLNXEPfNmnpxKDeZsFI5o4J+nz6xUlaFdF/4=
1183+
go.opentelemetry.io/otel/metric v1.42.0/go.mod h1:RlUN/7vTU7Ao/diDkEpQpnz3/92J9ko05BIwxYa2SSI=
11841184
go.opentelemetry.io/otel/sdk v1.40.0 h1:KHW/jUzgo6wsPh9At46+h4upjtccTmuZCFAc9OJ71f8=
11851185
go.opentelemetry.io/otel/sdk v1.40.0/go.mod h1:Ph7EFdYvxq72Y8Li9q8KebuYUr2KoeyHx0DRMKrYBUE=
11861186
go.opentelemetry.io/otel/sdk/metric v1.40.0 h1:mtmdVqgQkeRxHgRv4qhyJduP3fYJRMX4AtAlbuWdCYw=
11871187
go.opentelemetry.io/otel/sdk/metric v1.40.0/go.mod h1:4Z2bGMf0KSK3uRjlczMOeMhKU2rhUqdWNoKcYrtcBPg=
1188-
go.opentelemetry.io/otel/trace v1.40.0 h1:WA4etStDttCSYuhwvEa8OP8I5EWu24lkOzp+ZYblVjw=
1189-
go.opentelemetry.io/otel/trace v1.40.0/go.mod h1:zeAhriXecNGP/s2SEG3+Y8X9ujcJOTqQ5RgdEJcawiA=
1188+
go.opentelemetry.io/otel/trace v1.42.0 h1:OUCgIPt+mzOnaUTpOQcBiM/PLQ/Op7oq6g4LenLmOYY=
1189+
go.opentelemetry.io/otel/trace v1.42.0/go.mod h1:f3K9S+IFqnumBkKhRJMeaZeNk9epyhnCmQh/EysQCdc=
11901190
go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A=
11911191
go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4=
11921192
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
@@ -1284,8 +1284,8 @@ golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
12841284
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
12851285
golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo=
12861286
golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y=
1287-
golang.org/x/oauth2 v0.35.0 h1:Mv2mzuHuZuY2+bkyWXIHMfhNdJAdwW3FuWeCPYN5GVQ=
1288-
golang.org/x/oauth2 v0.35.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
1287+
golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs=
1288+
golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q=
12891289
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
12901290
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
12911291
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1421,8 +1421,8 @@ google.golang.org/genproto/googleapis/api v0.0.0-20251222181119-0a764e51fe1b/go.
14211421
google.golang.org/genproto/googleapis/rpc v0.0.0-20251222181119-0a764e51fe1b h1:Mv8VFug0MP9e5vUxfBcE3vUkV6CImK3cMNMIDFjmzxU=
14221422
google.golang.org/genproto/googleapis/rpc v0.0.0-20251222181119-0a764e51fe1b/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ=
14231423
google.golang.org/grpc v1.0.5/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
1424-
google.golang.org/grpc v1.79.1 h1:zGhSi45ODB9/p3VAawt9a+O/MULLl9dpizzNNpq7flY=
1425-
google.golang.org/grpc v1.79.1/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ=
1424+
google.golang.org/grpc v1.79.2 h1:fRMD94s2tITpyJGtBBn7MkMseNpOZU8ZxgC3MMBaXRU=
1425+
google.golang.org/grpc v1.79.2/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ=
14261426
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
14271427
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
14281428
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=

internal/functions/serve/serve.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,12 +126,14 @@ func ServeFunctions(ctx context.Context, envFilePath string, noVerifyJWT *bool,
126126
if err != nil {
127127
return err
128128
}
129+
jwks, _ := utils.Config.Auth.ResolveJWKS(ctx)
129130
env = append(env,
130131
fmt.Sprintf("SUPABASE_URL=http://%s:8000", utils.KongAliases[0]),
131132
"SUPABASE_ANON_KEY="+utils.Config.Auth.AnonKey.Value,
132133
"SUPABASE_SERVICE_ROLE_KEY="+utils.Config.Auth.ServiceRoleKey.Value,
133134
"SUPABASE_DB_URL="+dbUrl,
134135
"SUPABASE_INTERNAL_JWT_SECRET="+utils.Config.Auth.JwtSecret.Value,
136+
"SUPABASE_INTERNAL_JWKS="+jwks,
135137
fmt.Sprintf("SUPABASE_INTERNAL_HOST_PORT=%d", utils.Config.Api.Port),
136138
)
137139
if viper.GetBool("DEBUG") {

internal/functions/serve/templates/main.ts

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { STATUS_CODE, STATUS_TEXT } from "https://deno.land/std/http/status.ts";
22
import * as posix from "https://deno.land/std/path/posix/mod.ts";
33

4-
import * as jose from "https://deno.land/x/jose@v4.13.1/index.ts";
4+
import * as jose from "jsr:@panva/jose@6";
55

66
const SB_SPECIFIC_ERROR_CODE = {
77
BootError:
@@ -29,8 +29,9 @@ const SB_SPECIFIC_ERROR_REASON = {
2929
// OS stuff - we don't want to expose these to the functions.
3030
const EXCLUDED_ENVS = ["HOME", "HOSTNAME", "PATH", "PWD"];
3131

32-
const JWT_SECRET = Deno.env.get("SUPABASE_INTERNAL_JWT_SECRET")!;
3332
const HOST_PORT = Deno.env.get("SUPABASE_INTERNAL_HOST_PORT")!;
33+
const JWT_SECRET = Deno.env.get("SUPABASE_INTERNAL_JWT_SECRET")!;
34+
const JWKS_ENDPOINT = new URL('/auth/v1/.well-known/jwks.json', Deno.env.get("SUPABASE_URL")!)
3435
const DEBUG = Deno.env.get("SUPABASE_INTERNAL_DEBUG") === "true";
3536
const FUNCTIONS_CONFIG_STRING = Deno.env.get(
3637
"SUPABASE_INTERNAL_FUNCTIONS_CONFIG",
@@ -105,18 +106,62 @@ function getAuthToken(req: Request) {
105106
return token;
106107
}
107108

108-
async function verifyJWT(jwt: string): Promise<boolean> {
109+
async function isValidLegacyJWT(jwtSecret: string, jwt: string): Promise<boolean> {
109110
const encoder = new TextEncoder();
110-
const secretKey = encoder.encode(JWT_SECRET);
111+
const secretKey = encoder.encode(jwtSecret);
111112
try {
112113
await jose.jwtVerify(jwt, secretKey);
113114
} catch (e) {
114-
console.error(e);
115+
console.error('Symmetric Legacy JWT verification error', e);
116+
return false;
117+
}
118+
return true;
119+
}
120+
121+
// Lazy-loading JWKs
122+
let jwks = (() => {
123+
try {
124+
// using injected JWKS from cli
125+
return jose.createLocalJWKSet(JSON.parse(Deno.env.get('SUPABASE_INTERNAL_JWKS')));
126+
} catch (error) {
127+
return null
128+
}
129+
})();
130+
131+
async function isValidJWT(jwksUrl: string, jwt: string): Promise<boolean> {
132+
try {
133+
if (!jwks) {
134+
// Loading from remote-url on fly
135+
jwks = jose.createRemoteJWKSet(new URL(jwksUrl));
136+
}
137+
await jose.jwtVerify(jwt, jwks);
138+
} catch (e) {
139+
console.error('Asymmetric JWT verification error', e);
115140
return false;
116141
}
117142
return true;
118143
}
119144

145+
/**
146+
* Applies hybrid JWT verification, using JWK as primary and Legacy Secret as fallback.
147+
* Use only during 'New JWT Keys' migration period, while `JWT_SECRET` is still available.
148+
*/
149+
export async function verifyHybridJWT(jwtSecret: string, jwksUrl: string, jwt: string): Promise<boolean> {
150+
const { alg: jwtAlgorithm } = jose.decodeProtectedHeader(jwt)
151+
152+
if (jwtAlgorithm === 'HS256') {
153+
console.log(`Legacy token type detected, attempting ${jwtAlgorithm} verification.`)
154+
155+
return await isValidLegacyJWT(jwtSecret, jwt)
156+
}
157+
158+
if (jwtAlgorithm === 'ES256' || jwtAlgorithm === 'RS256') {
159+
return await isValidJWT(jwksUrl, jwt)
160+
}
161+
162+
return false;
163+
}
164+
120165
// Ref: https://docs.deno.com/examples/checking_file_existence/
121166
async function shouldUsePackageJsonDiscovery({ entrypointPath, importMapPath }: FunctionConfig): Promise<boolean> {
122167
if (importMapPath) {
@@ -159,7 +204,7 @@ Deno.serve({
159204
if (req.method !== "OPTIONS" && functionsConfig[functionName].verifyJWT) {
160205
try {
161206
const token = getAuthToken(req);
162-
const isValidJWT = await verifyJWT(token);
207+
const isValidJWT = await verifyHybridJWT(JWT_SECRET, JWKS_ENDPOINT, token);
163208

164209
if (!isValidJWT) {
165210
return getResponse({ msg: "Invalid JWT" }, STATUS_CODE.Unauthorized);

internal/start/start.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1168,6 +1168,9 @@ EOF
11681168
"SUPABASE_SERVICE_KEY=" + utils.Config.Auth.ServiceRoleKey.Value,
11691169
"LOGFLARE_PRIVATE_ACCESS_TOKEN=" + utils.Config.Analytics.ApiKey,
11701170
"OPENAI_API_KEY=" + utils.Config.Studio.OpenaiApiKey.Value,
1171+
"PGRST_DB_SCHEMAS=" + strings.Join(utils.Config.Api.Schemas, ","),
1172+
"PGRST_DB_EXTRA_SEARCH_PATH=" + strings.Join(utils.Config.Api.ExtraSearchPath, ","),
1173+
fmt.Sprintf("PGRST_DB_MAX_ROWS=%d", utils.Config.Api.MaxRows),
11711174
fmt.Sprintf("LOGFLARE_URL=http://%v:4000", utils.LogflareId),
11721175
fmt.Sprintf("NEXT_PUBLIC_ENABLE_LOGS=%v", utils.Config.Analytics.Enabled),
11731176
fmt.Sprintf("NEXT_ANALYTICS_BACKEND_PROVIDER=%v", utils.Config.Analytics.Backend),

internal/utils/misc.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ var (
7575
PoolerVersionPath = filepath.Join(TempDir, "pooler-version")
7676
RealtimeVersionPath = filepath.Join(TempDir, "realtime-version")
7777
CliVersionPath = filepath.Join(TempDir, "cli-latest")
78-
ProfilePath = filepath.Join(TempDir, "profile")
7978
CurrBranchPath = filepath.Join(SupabaseDirPath, ".branches", "_current_branch")
8079
ClusterDir = filepath.Join(SupabaseDirPath, "cluster")
8180
SchemasDir = filepath.Join(SupabaseDirPath, "schemas")

0 commit comments

Comments
 (0)