+
+// Extract either the 200 or 201 response object
+type SuccessResponse = RemapPaths[P][M] extends {
+ responses: { 200: { content: { 'application/json': infer R200 } } }
+}
+ ? R200
+ : RemapPaths[P][M] extends {
+ responses: { 201: { content: { 'application/json': infer R201 } } }
+ }
+ ? R201
+ : never
+
+const isResponseResolver = (val: unknown): val is HttpResponseResolver => typeof val === `function`
+
+export const addAPIMock =
({
method,
path,
response,
}: {
- method: keyof typeof http
- path: string
- response: any
+ method: M
+ path: P
+ response: SuccessResponse, M> | HttpResponseResolver
}) => {
const fullPath = `${API_URL}${path}`
- console.log('[MSW] Adding mock:', method, fullPath)
+ console.log('[MSW] Adding mock:', method.toUpperCase(), fullPath)
mswServer.use(
- http[method](fullPath, () => {
- return HttpResponse.json(response)
- })
+ http[method](
+ fullPath,
+ isResponseResolver(response)
+ ? response
+ : ({ request }) => {
+ console.log('[MSW] Handling request:', request.method, request.url, response)
+ return HttpResponse.json(response ?? null)
+ }
+ )
)
}
diff --git a/apps/studio/tests/setup/polyfills.js b/apps/studio/tests/setup/polyfills.js
deleted file mode 100644
index d80798f25fe..00000000000
--- a/apps/studio/tests/setup/polyfills.js
+++ /dev/null
@@ -1,13 +0,0 @@
-const { TextDecoder, TextEncoder } = require('node:util')
-
-Object.defineProperties(globalThis, {
- TextDecoder: { value: TextDecoder },
- TextEncoder: { value: TextEncoder },
- CSS: {
- value: {
- supports: (k, v) => false,
- escape: (v) => v,
- },
- },
- TransformStream: { value: null },
-})
diff --git a/apps/studio/tests/setup/polyfills.ts b/apps/studio/tests/setup/polyfills.ts
new file mode 100644
index 00000000000..f8702bb7e71
--- /dev/null
+++ b/apps/studio/tests/setup/polyfills.ts
@@ -0,0 +1,37 @@
+import { TextDecoder, TextEncoder } from 'node:util'
+import { ReadableStream, TransformStream } from 'node:stream/web'
+import { vi } from 'vitest'
+import { configMocks } from 'jsdom-testing-mocks'
+import { act } from '@testing-library/react'
+
+configMocks({ act })
+
+// Warning: `restoreMocks: true` in vitest.config.ts will
+// cause this global mockImplementation to be **reset**
+// before any tests are run!
+Object.defineProperty(window, 'matchMedia', {
+ writable: true,
+ value: vi.fn().mockImplementation((query) => ({
+ matches: false,
+ media: query,
+ onchange: null,
+ addListener: vi.fn(), // deprecated
+ removeListener: vi.fn(), // deprecated
+ addEventListener: vi.fn(),
+ removeEventListener: vi.fn(),
+ dispatchEvent: vi.fn(),
+ })),
+})
+
+Object.defineProperties(globalThis, {
+ TextDecoder: { value: TextDecoder },
+ TextEncoder: { value: TextEncoder },
+ CSS: {
+ value: {
+ supports: (_k: any, _v: any) => false,
+ escape: (v: any) => v,
+ },
+ },
+ ReadableStream: { value: ReadableStream },
+ TransformStream: { value: TransformStream },
+})
diff --git a/apps/studio/tests/vitestSetup.ts b/apps/studio/tests/vitestSetup.ts
index 23c1903adfa..e32fd66226f 100644
--- a/apps/studio/tests/vitestSetup.ts
+++ b/apps/studio/tests/vitestSetup.ts
@@ -5,22 +5,6 @@ import { afterAll, afterEach, beforeAll, vi } from 'vitest'
import { routerMock } from './lib/route-mock'
import { mswServer } from './lib/msw'
-mswServer.listen({ onUnhandledRequest: 'error' })
-
-Object.defineProperty(window, 'matchMedia', {
- writable: true,
- value: vi.fn().mockImplementation((query) => ({
- matches: false,
- media: query,
- onchange: null,
- addListener: vi.fn(), // deprecated
- removeListener: vi.fn(), // deprecated
- addEventListener: vi.fn(),
- removeEventListener: vi.fn(),
- dispatchEvent: vi.fn(),
- })),
-})
-
// Uncomment this if HTML in errors are being annoying.
//
// configure({
@@ -32,6 +16,7 @@ Object.defineProperty(window, 'matchMedia', {
// })
beforeAll(() => {
+ mswServer.listen({ onUnhandledRequest: `error` })
vi.mock('next/router', () => require('next-router-mock'))
vi.mock('next/navigation', async () => {
const actual = await vi.importActual('next/navigation')
@@ -55,10 +40,11 @@ beforeAll(() => {
routerMock.useParser(createDynamicRouteParser(['/projects/[ref]']))
})
-afterAll(() => mswServer.close())
-
-afterEach(() => mswServer.resetHandlers())
-
afterEach(() => {
+ mswServer.resetHandlers()
cleanup()
})
+
+afterAll(() => {
+ mswServer.close()
+})
diff --git a/apps/studio/vitest.config.ts b/apps/studio/vitest.config.ts
index f2a848d5581..1f453470208 100644
--- a/apps/studio/vitest.config.ts
+++ b/apps/studio/vitest.config.ts
@@ -1,8 +1,8 @@
-import react from '@vitejs/plugin-react'
-import path, { resolve } from 'path'
-import { fileURLToPath } from 'url'
-import tsconfigPaths from 'vite-tsconfig-paths'
+import { resolve } from 'node:path'
+import { fileURLToPath } from 'node:url'
import { defineConfig } from 'vitest/config'
+import react from '@vitejs/plugin-react'
+import tsconfigPaths from 'vite-tsconfig-paths'
// Some tools like Vitest VSCode extensions, have trouble with resolving relative paths,
// as they use the directory of the test file as `cwd`, which makes them believe that
@@ -18,14 +18,12 @@ export default defineConfig({
],
resolve: {
alias: {
- '@ui': path.resolve(__dirname, './../../packages/ui/src'),
+ '@ui': resolve(__dirname, './../../packages/ui/src'),
},
},
test: {
globals: true,
environment: 'jsdom', // TODO(kamil): This should be set per test via header in .tsx files only
- include: [resolve(dirname, './**/*.test.{ts,tsx}')],
- restoreMocks: true,
setupFiles: [
resolve(dirname, './tests/vitestSetup.ts'),
resolve(dirname, './tests/setup/polyfills.js'),
@@ -34,12 +32,7 @@ export default defineConfig({
reporters: [['default']],
coverage: {
reporter: ['lcov'],
- exclude: [
- '**/*.test.ts',
- '**/*.test.tsx',
- // 👇 Excluded because it will be deprecated.
- 'lib/common/fetch/**',
- ],
+ exclude: ['**/*.test.ts', '**/*.test.tsx'],
include: ['lib/**/*.ts'],
},
},
diff --git a/data.sql b/data.sql
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/packages/api-types/types/api.d.ts b/packages/api-types/types/api.d.ts
index 0f93564023b..1a901f0e60d 100644
--- a/packages/api-types/types/api.d.ts
+++ b/packages/api-types/types/api.d.ts
@@ -1603,7 +1603,7 @@ export interface components {
role: string
} | null
/** @enum {string|null} */
- type?: 'publishable' | 'secret' | 'legacy' | null
+ type?: 'legacy' | 'publishable' | 'secret' | null
/** Format: date-time */
updated_at?: string | null
}
@@ -1984,6 +1984,7 @@ export interface components {
secrets?: {
[key: string]: string
}
+ with_data?: boolean
}
CreateOrganizationV1: {
name: string
diff --git a/packages/api-types/types/platform.d.ts b/packages/api-types/types/platform.d.ts
index 090d53fbbd8..23e0737d942 100644
--- a/packages/api-types/types/platform.d.ts
+++ b/packages/api-types/types/platform.d.ts
@@ -3391,6 +3391,23 @@ export interface paths {
patch?: never
trace?: never
}
+ '/platform/replication/{ref}/pipelines/{pipeline_id}/replication-status': {
+ parameters: {
+ query?: never
+ header?: never
+ path?: never
+ cookie?: never
+ }
+ /** Get the status of a replication pipeline. */
+ get: operations['ReplicationPipelinesController_getPipelineReplicationStatus']
+ put?: never
+ post?: never
+ delete?: never
+ options?: never
+ head?: never
+ patch?: never
+ trace?: never
+ }
'/platform/replication/{ref}/pipelines/{pipeline_id}/start': {
parameters: {
query?: never
@@ -4282,12 +4299,12 @@ export interface components {
BillingCustomerUpdateBody: {
additional_emails?: string[]
address?: {
- city?: string
+ city?: string | null
country: string
line1: string
- line2?: string
- postal_code?: string
- state?: string
+ line2?: string | null
+ postal_code?: string | null
+ state?: string | null
}
billing_name?: string
}
@@ -4621,12 +4638,12 @@ export interface components {
}
CreateOrganizationBody: {
address?: {
- city?: string
+ city?: string | null
country: string
line1: string
- line2?: string
- postal_code?: string
- state?: string
+ line2?: string | null
+ postal_code?: string | null
+ state?: string | null
}
billing_name?: string
kind?: string
@@ -5027,9 +5044,23 @@ export interface components {
teamId?: string
}
CreditsTopUpRequest: {
+ address?: {
+ city?: string | null
+ country: string
+ line1: string
+ line2?: string | null
+ postal_code?: string | null
+ state?: string | null
+ }
amount: number
+ billing_name?: string
hcaptcha_token?: string
payment_method_id: string
+ tax_id?: {
+ country: string
+ type: string
+ value: string
+ }
}
CreditsTopUpResponse: {
payment_intent_secret?: string
@@ -5046,12 +5077,12 @@ export interface components {
CustomerResponse: {
additional_emails: string[] | null
address?: {
- city?: string
+ city?: string | null
country: string
line1: string
- line2?: string
- postal_code?: string
- state?: string
+ line2?: string | null
+ postal_code?: string | null
+ state?: string | null
}
balance: number
billing_name?: string
@@ -6536,6 +6567,7 @@ export interface components {
last4: string
}
created: number
+ has_address: boolean
id: string
is_default: boolean
type: string
@@ -7338,6 +7370,41 @@ export interface components {
tenant_id: string
}[]
}
+ ReplicationPipelineReplicationStatusResponse: {
+ /** @description Pipeline id */
+ pipeline_id: number
+ /** @description Table statuses */
+ table_statuses: {
+ /** @description Table replication state */
+ state:
+ | {
+ /** @enum {string} */
+ name: 'queued'
+ }
+ | {
+ /** @enum {string} */
+ name: 'copying_table'
+ }
+ | {
+ /** @enum {string} */
+ name: 'copied_table'
+ }
+ | {
+ lag: number
+ /** @enum {string} */
+ name: 'following_wal'
+ }
+ | {
+ message: string
+ /** @enum {string} */
+ name: 'error'
+ }
+ /** @description Table id (internal Postgres OID) */
+ table_id: number
+ /** @description Table name */
+ table_name: string
+ }[]
+ }
ReplicationPipelineResponse: {
/** @description Pipeline config */
config: {
@@ -7835,7 +7902,6 @@ export interface components {
organization_id: number
region: string
status: string
- subscription_id: string
}
UpcomingInvoice: {
amount_projected?: number
@@ -8585,7 +8651,21 @@ export interface components {
fileSizeLimit?: number
}
UpdateSubscriptionBody: {
+ address?: {
+ city?: string | null
+ country: string
+ line1: string
+ line2?: string | null
+ postal_code?: string | null
+ state?: string | null
+ }
+ billing_name?: string
payment_method?: string
+ tax_id?: {
+ country: string
+ type: string
+ value: string
+ }
/** @enum {string} */
tier: 'tier_free' | 'tier_pro' | 'tier_payg' | 'tier_team' | 'tier_enterprise'
}
@@ -11308,6 +11388,12 @@ export interface operations {
'application/json': components['schemas']['CustomerResponse']
}
}
+ 403: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
/** @description Failed to retrieve the Billing customer */
500: {
headers: {
@@ -11422,6 +11508,12 @@ export interface operations {
}
content?: never
}
+ 403: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
/** @description Failed to get daily organization stats */
500: {
headers: {
@@ -11453,6 +11545,12 @@ export interface operations {
}
content?: never
}
+ 403: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
/** @description Failed to get daily organization stats for compute */
500: {
headers: {
@@ -11893,6 +11991,12 @@ export interface operations {
'application/json': components['schemas']['MemberWithFreeProjectLimit'][]
}
}
+ 403: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
/** @description Failed to retrieve organization members who have reached their free project limit */
500: {
headers: {
@@ -12541,6 +12645,12 @@ export interface operations {
'application/json': components['schemas']['OrgUsageResponse']
}
}
+ 403: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
/** @description Failed to get usage stats */
500: {
headers: {
@@ -12606,6 +12716,8 @@ export interface operations {
query?: never
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -12643,6 +12755,8 @@ export interface operations {
query?: never
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -12684,6 +12798,8 @@ export interface operations {
query?: never
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -12728,6 +12844,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -12765,6 +12883,8 @@ export interface operations {
query?: never
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -12810,6 +12930,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -12849,6 +12971,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -12890,6 +13014,8 @@ export interface operations {
query?: never
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -12927,6 +13053,8 @@ export interface operations {
query?: never
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -12970,6 +13098,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13012,6 +13142,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13052,6 +13184,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13089,6 +13223,8 @@ export interface operations {
query?: never
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13132,6 +13268,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13171,6 +13309,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13220,6 +13360,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13260,6 +13402,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13297,6 +13441,8 @@ export interface operations {
query?: never
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13340,6 +13486,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13379,6 +13527,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13420,6 +13570,8 @@ export interface operations {
query?: never
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13457,6 +13609,8 @@ export interface operations {
query?: never
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13500,6 +13654,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13539,6 +13695,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13580,6 +13738,8 @@ export interface operations {
query?: never
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13683,6 +13843,8 @@ export interface operations {
query?: never
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13720,6 +13882,8 @@ export interface operations {
query?: never
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13763,6 +13927,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13802,6 +13968,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13851,6 +14019,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13888,6 +14058,8 @@ export interface operations {
query?: never
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13933,6 +14105,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -13972,6 +14146,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -14016,6 +14192,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -14053,6 +14231,8 @@ export interface operations {
query?: never
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -14096,6 +14276,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -14135,6 +14317,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -14179,6 +14363,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -14224,6 +14410,8 @@ export interface operations {
}
header: {
'x-connection-encrypted': string
+ /** @description PostgreSQL connection application name */
+ 'x-pg-application-name'?: string
}
path: {
/** @description Project ref */
@@ -16471,6 +16659,12 @@ export interface operations {
'application/json': components['schemas']['GetUserContentResponse']
}
}
+ 403: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
/** @description Failed to retrieve project's content */
500: {
headers: {
@@ -16502,6 +16696,12 @@ export interface operations {
}
content?: never
}
+ 403: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
/** @description Failed to update project's content */
500: {
headers: {
@@ -16535,6 +16735,12 @@ export interface operations {
'application/json': components['schemas']['UserContentObject']
}
}
+ 403: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
/** @description Failed to create project's content */
500: {
headers: {
@@ -16566,6 +16772,12 @@ export interface operations {
'application/json': components['schemas']['BulkDeleteUserContentResponse'][]
}
}
+ 403: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
/** @description Failed to delete project's contents */
500: {
headers: {
@@ -16598,6 +16810,12 @@ export interface operations {
'application/json': components['schemas']['GetContentCountV2Response']
}
}
+ 403: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
/** @description Failed to retrieve user's content counts */
500: {
headers: {
@@ -16635,6 +16853,12 @@ export interface operations {
'application/json': components['schemas']['GetUserContentFolderResponse']
}
}
+ 403: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
/** @description Failed to retrieve project's content root folder */
500: {
headers: {
@@ -16668,6 +16892,12 @@ export interface operations {
'application/json': components['schemas']['CreateUserContentFolderResponse']
}
}
+ 403: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
/** @description Failed to create project's content folder */
500: {
headers: {
@@ -16694,6 +16924,12 @@ export interface operations {
}
content?: never
}
+ 403: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
/** @description Failed to delete project's content folders */
500: {
headers: {
@@ -16731,6 +16967,12 @@ export interface operations {
'application/json': components['schemas']['GetUserContentFolderResponse']
}
}
+ 403: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
/** @description Failed to retrieve project's content folder */
500: {
headers: {
@@ -16764,6 +17006,12 @@ export interface operations {
}
content?: never
}
+ 403: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
/** @description Failed to update project's content folder */
500: {
headers: {
@@ -16794,6 +17042,12 @@ export interface operations {
'application/json': components['schemas']['GetUserContentByIdResponse']
}
}
+ 403: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
/** @description Failed to retrieve project's content by the given id */
500: {
headers: {
@@ -16858,6 +17112,12 @@ export interface operations {
}
content?: never
}
+ 403: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
/** @description Failed to get daily project stats */
500: {
headers: {
@@ -18497,6 +18757,44 @@ export interface operations {
}
}
}
+ ReplicationPipelinesController_getPipelineReplicationStatus: {
+ parameters: {
+ query?: never
+ header?: never
+ path: {
+ /** @description Pipeline id */
+ pipeline_id: number
+ /** @description Project ref */
+ ref: string
+ }
+ cookie?: never
+ }
+ requestBody?: never
+ responses: {
+ /** @description Returns the pipeline replication status. */
+ 200: {
+ headers: {
+ [name: string]: unknown
+ }
+ content: {
+ 'application/json': components['schemas']['ReplicationPipelineReplicationStatusResponse']
+ }
+ }
+ 403: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
+ /** @description Failed to get pipeline replication status. */
+ 500: {
+ headers: {
+ [name: string]: unknown
+ }
+ content?: never
+ }
+ }
+ }
ReplicationPipelinesController_startPipeline: {
parameters: {
query?: never
diff --git a/packages/common/consent-state.ts b/packages/common/consent-state.ts
index 8575a76c883..23e1109dfbd 100644
--- a/packages/common/consent-state.ts
+++ b/packages/common/consent-state.ts
@@ -61,10 +61,13 @@ export const consentState = proxy({
async function initUserCentrics() {
if (process.env.NODE_ENV === 'test' || !IS_PLATFORM) return
- // [Alaister] For local development, we accept all consent by default.
- // If you need to test usercentrics locally, comment out the
+ // [Alaister] For local development and staging, we accept all consent by default.
+ // If you need to test usercentrics in these environments, comment out this
// NEXT_PUBLIC_ENVIRONMENT check and add an ngrok domain to usercentrics
- if (process.env.NEXT_PUBLIC_ENVIRONMENT === 'local') {
+ if (
+ process.env.NEXT_PUBLIC_ENVIRONMENT === 'local' ||
+ process.env.NEXT_PUBLIC_ENVIRONMENT === 'staging'
+ ) {
consentState.hasConsented = true
return
}
diff --git a/packages/common/telemetry-constants.ts b/packages/common/telemetry-constants.ts
index 2886475adef..44c2f1db806 100644
--- a/packages/common/telemetry-constants.ts
+++ b/packages/common/telemetry-constants.ts
@@ -9,6 +9,11 @@
* @module telemetry-frontend
*/
+type TelemetryGroups = {
+ project: string
+ organization: string
+}
+
/**
* Triggered when a user signs up. When signing up with Email and Password, this is only triggered once user confirms their email.
*
@@ -66,10 +71,7 @@ export interface ConnectionStringCopiedEvent {
*/
connectionMethod: 'direct' | 'transaction_pooler' | 'session_pooler'
}
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -91,10 +93,7 @@ export interface CronJobCreatedEvent {
*/
schedule: string
}
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -116,10 +115,7 @@ export interface CronJobUpdatedEvent {
*/
schedule: string
}
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -131,10 +127,7 @@ export interface CronJobUpdatedEvent {
*/
export interface CronJobDeletedEvent {
action: 'cron_job_deleted'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -146,10 +139,7 @@ export interface CronJobDeletedEvent {
*/
export interface CronJobCreateClickedEvent {
action: 'cron_job_create_clicked'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -161,10 +151,7 @@ export interface CronJobCreateClickedEvent {
*/
export interface CronJobUpdateClickedEvent {
action: 'cron_job_update_clicked'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -176,10 +163,7 @@ export interface CronJobUpdateClickedEvent {
*/
export interface CronJobDeleteClickedEvent {
action: 'cron_job_delete_clicked'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -191,10 +175,7 @@ export interface CronJobDeleteClickedEvent {
*/
export interface CronJobHistoryClickedEvent {
action: 'cron_job_history_clicked'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -213,10 +194,7 @@ export interface FeaturePreviewEnabledEvent {
*/
feature: string
}
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -235,10 +213,7 @@ export interface FeaturePreviewDisabledEvent {
*/
feature: string
}
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -256,10 +231,7 @@ export interface ProjectCreationSimpleVersionSubmittedEvent {
properties: {
instanceSize: string
}
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -277,9 +249,7 @@ export interface ProjectCreationSimpleVersionConfirmModalOpenedEvent {
properties: {
instanceSize: string
}
- groups: {
- organization: string
- }
+ groups: Omit
}
/**
@@ -357,10 +327,7 @@ export interface ProjectCreationSecondStepSubmittedEvent {
*/
export interface RealtimeInspectorListenChannelClickedEvent {
action: 'realtime_inspector_listen_channel_clicked'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -372,10 +339,7 @@ export interface RealtimeInspectorListenChannelClickedEvent {
*/
export interface RealtimeInspectorBroadcastSentEvent {
action: 'realtime_inspector_broadcast_sent'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -387,10 +351,7 @@ export interface RealtimeInspectorBroadcastSentEvent {
*/
export interface RealtimeInspectorMessageClickedEvent {
action: 'realtime_inspector_message_clicked'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -402,10 +363,7 @@ export interface RealtimeInspectorMessageClickedEvent {
*/
export interface RealtimeInspectorCopyMessageClickedEvent {
action: 'realtime_inspector_copy_message_clicked'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -417,10 +375,7 @@ export interface RealtimeInspectorCopyMessageClickedEvent {
*/
export interface RealtimeInspectorFiltersAppliedEvent {
action: 'realtime_inspector_filters_applied'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -432,10 +387,7 @@ export interface RealtimeInspectorFiltersAppliedEvent {
*/
export interface RealtimeInspectorDatabaseRoleUpdatedEvent {
action: 'realtime_inspector_database_role_updated'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -457,10 +409,7 @@ export interface RealtimeToggleTableClickedEvent {
*/
origin: 'tableSidePanel' | 'tableGridHeader'
}
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -478,10 +427,7 @@ export interface SqlEditorQuickstartClickedEvent {
*/
quickstartName: string
}
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -499,10 +445,7 @@ export interface SqlEditorTemplateClickedEvent {
*/
templateName: string
}
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -514,10 +457,7 @@ export interface SqlEditorTemplateClickedEvent {
*/
export interface SqlEditorResultDownloadCsvClickedEvent {
action: 'sql_editor_result_download_csv_clicked'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -529,10 +469,7 @@ export interface SqlEditorResultDownloadCsvClickedEvent {
*/
export interface SqlEditorResultCopyMarkdownClickedEvent {
action: 'sql_editor_result_copy_markdown_clicked'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -544,10 +481,7 @@ export interface SqlEditorResultCopyMarkdownClickedEvent {
*/
export interface SqlEditorResultCopyJsonClickedEvent {
action: 'sql_editor_result_copy_json_clicked'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -558,10 +492,7 @@ export interface SqlEditorResultCopyJsonClickedEvent {
*/
export interface AssistantPromptSubmittedEvent {
action: 'assistant_prompt_submitted'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -572,10 +503,7 @@ export interface AssistantPromptSubmittedEvent {
*/
export interface AssistantDebugSubmittedEvent {
action: 'assistant_debug_submitted'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -593,10 +521,7 @@ export interface AssistantSuggestionRunQueryClickedEvent {
queryType: string
category?: string
}
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -617,10 +542,7 @@ export interface AssistantSqlDiffHandlerEvaluatedEvent {
*/
handlerAccepted: boolean
}
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -638,10 +560,7 @@ export interface AssistantEditInSqlEditorClickedEvent {
isInSQLEditor: boolean
isInNewSnippet: boolean
}
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -653,10 +572,7 @@ export interface AssistantEditInSqlEditorClickedEvent {
*/
export interface CustomReportAddSQLBlockClicked {
action: 'custom_report_add_sql_block_clicked'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -668,10 +584,7 @@ export interface CustomReportAddSQLBlockClicked {
*/
export interface CustomReportAssistantSQLBlockAddedEvent {
action: 'custom_report_assistant_sql_block_added'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -941,10 +854,7 @@ export interface SignInButtonClickedEvent {
*/
export interface HelpButtonClickedEvent {
action: 'help_button_clicked'
- groups: {
- project?: string
- organization?: string
- }
+ groups: Partial
}
/**
@@ -955,10 +865,7 @@ export interface HelpButtonClickedEvent {
*/
export interface SendFeedbackButtonClickedEvent {
action: 'send_feedback_button_clicked'
- groups: {
- project?: string
- organization?: string
- }
+ groups: Partial
}
/**
@@ -976,10 +883,7 @@ export interface ExampleProjectCardClickedEvent {
*/
cardTitle: string
}
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -999,10 +903,7 @@ export interface ImportDataButtonClickedEvent {
*/
tableType: 'New Table' | 'Existing Table'
}
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -1014,10 +915,7 @@ export interface ImportDataButtonClickedEvent {
*/
export interface ImportDataAddedEvent {
action: 'import_data_added'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -1029,10 +927,7 @@ export interface ImportDataAddedEvent {
*/
export interface SqlEditorQueryRunButtonClickedEvent {
action: 'sql_editor_query_run_button_clicked'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -1054,7 +949,7 @@ export interface StudioPricingPlanCtaClickedEvent {
*/
currentPlan?: string
}
- groups: { organization: string }
+ groups: Omit
}
/**
@@ -1073,7 +968,7 @@ export interface StudioPricingSidePanelOpenedEvent {
*/
origin?: string
}
- groups: { organization: string }
+ groups: Omit
}
/**
@@ -1085,10 +980,7 @@ export interface StudioPricingSidePanelOpenedEvent {
*/
export interface ReportsDatabaseGrafanaBannerClickedEvent {
action: 'reports_database_grafana_banner_clicked'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -1108,10 +1000,7 @@ export interface EdgeFunctionDeployButtonClickedEvent {
*/
origin: 'functions_editor' | 'functions_ai_assistant'
}
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -1123,10 +1012,7 @@ export interface EdgeFunctionDeployButtonClickedEvent {
*/
export interface EdgeFunctionDeployUpdatesConfirmClickedEvent {
action: 'edge_function_deploy_updates_confirm_clicked'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -1147,10 +1033,7 @@ export interface EdgeFunctionAiAssistantButtonClickedEvent {
*/
origin: 'no_functions_block' | 'secondary_action' | 'functions_editor_chat'
}
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -1170,10 +1053,7 @@ export interface EdgeFunctionViaEditorButtonClickedEvent {
*/
origin: 'no_functions_block' | 'secondary_action'
}
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -1194,10 +1074,7 @@ export interface EdgeFunctionTemplateClickedEvent {
*/
origin: 'functions_page' | 'editor_page'
}
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -1217,10 +1094,7 @@ export interface EdgeFunctionViaCliButtonClickedEvent {
*/
origin: 'no_functions_block' | 'secondary_action'
}
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -1232,10 +1106,7 @@ export interface EdgeFunctionViaCliButtonClickedEvent {
*/
export interface EdgeFunctionDeployUpdatesButtonClickedEvent {
action: 'edge_function_deploy_updates_button_clicked'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -1253,10 +1124,7 @@ export interface EdgeFunctionTestSendButtonClickedEvent {
*/
httpMethod: string
}
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -1268,10 +1136,7 @@ export interface EdgeFunctionTestSendButtonClickedEvent {
*/
export interface EdgeFunctionTestSidePanelOpenedEvent {
action: 'edge_function_test_side_panel_opened'
- groups: {
- project: string
- organization: string
- }
+ groups: TelemetryGroups
}
/**
@@ -1286,10 +1151,7 @@ export interface SupportTicketSubmittedEvent {
properties: {
ticketCategory: string
}
- groups: {
- project?: string
- organization?: string
- }
+ groups: Partial
}
/**
@@ -1302,10 +1164,7 @@ export interface SupportTicketSubmittedEvent {
*/
export interface AiAssistantInSupportFormClickedEvent {
action: 'ai_assistant_in_support_form_clicked'
- groups: {
- project?: string
- organization?: string
- }
+ groups: Partial
}
/**
@@ -1337,9 +1196,7 @@ export interface OrganizationMfaEnforcementUpdated {
properties: {
mfaEnforced: boolean
}
- groups: {
- organization: string
- }
+ groups: Omit
}
/**
@@ -1357,10 +1214,184 @@ export interface ForeignDataWrapperCreatedEvent {
*/
wrapperType: string
}
- groups: {
- project: string
- organization: string
+ groups: TelemetryGroups
+}
+
+/**
+ * Triggered when a new storage bucket is created in a project.
+ *
+ * @group Events
+ * @source studio
+ * @page /dashboard/project/{ref}/storage/buckets
+ */
+export interface StorageBucketCreatedEvent {
+ action: 'storage_bucket_created'
+ properties: {
+ /**
+ * The type of the bucket created. E.g. standard or analytics iceberg.
+ */
+ bucketType?: string
}
+ groups: TelemetryGroups
+}
+
+/**
+ * Triggered when a new branch is created.
+ *
+ * @group Events
+ * @source studio
+ * @page /dashboard/project/{ref}/branches
+ */
+export interface BranchCreateButtonClickedEvent {
+ action: 'branch_create_button_clicked'
+ properties: {
+ /**
+ * The type of branch created, e.g. preview, persistent
+ */
+ branchType: 'preview' | 'persistent'
+ /**
+ * Whether the branch was created with a git branch association
+ */
+ gitlessBranching: boolean
+ }
+ groups: TelemetryGroups
+}
+
+/**
+ * Triggered when a branch delete button is clicked.
+ *
+ * @group Events
+ * @source studio
+ * @page /dashboard/project/{ref}/branches
+ */
+export interface BranchDeleteButtonClickedEvent {
+ action: 'branch_delete_button_clicked'
+ properties: {
+ /**
+ * The type of branch being deleted, e.g. preview, persistent
+ */
+ branchType?: 'preview' | 'persistent'
+ /**
+ * Where the delete action was initiated from
+ */
+ origin: 'branches_page' | 'merge_page'
+ }
+ groups: TelemetryGroups
+}
+
+/**
+ * Triggered when a create merge request is clicked for a branch.
+ *
+ * @group Events
+ * @source studio
+ * @page /dashboard/project/{ref}/branches
+ */
+export interface BranchCreateMergeRequestButtonClickedEvent {
+ action: 'branch_create_merge_request_button_clicked'
+ properties: {
+ /**
+ * The type of branch being merged, e.g. preview, persistent
+ */
+ branchType: 'preview' | 'persistent'
+ origin: 'header' | 'merge_page' | 'branch_selector'
+ }
+ groups: TelemetryGroups
+}
+
+/**
+ * Triggered when a merge request is closed.
+ *
+ * @group Events
+ * @source studio
+ * @page /dashboard/project/{ref}/branches/merge-requests
+ */
+export interface BranchCloseMergeRequestButtonClickedEvent {
+ action: 'branch_close_merge_request_button_clicked'
+ groups: TelemetryGroups
+}
+
+/**
+ * Triggered when a user clicks the merge button successfully to attempt merging a branch.
+ *
+ * @group Events
+ * @source studio
+ * @page /dashboard/project/{ref}/merge
+ */
+export interface BranchMergeSubmittedEvent {
+ action: 'branch_merge_submitted'
+ groups: TelemetryGroups
+}
+
+/**
+ * Triggered when a branch merge is successful.
+ *
+ * @group Events
+ * @source studio
+ * @page /dashboard/project/{ref}/merge
+ */
+export interface BranchMergeSucceededEvent {
+ action: 'branch_merge_succeeded'
+ properties: {
+ /**
+ * The type of branch being merged, e.g. preview, persistent
+ */
+ branchType: 'preview' | 'persistent'
+ }
+ groups: TelemetryGroups
+}
+
+/**
+ * Triggered when a branch merge fails.
+ *
+ * @group Events
+ * @source studio
+ * @page /dashboard/project/{ref}/merge
+ */
+export interface BranchMergeFailedEvent {
+ action: 'branch_merge_failed'
+ properties: {
+ /**
+ * The type of branch being merged, e.g. preview, persistent
+ */
+ branchType: 'preview' | 'persistent'
+ /**
+ * The error message or reason for failure
+ */
+ error?: string
+ }
+ groups: TelemetryGroups
+}
+
+/**
+ * Triggered when a branch is updated on push with latest changes from production.
+ * Does not include renaming and linking to GitHub branch.
+ *
+ * @group Events
+ * @source studio
+ * @page /dashboard/project/{ref}/merge
+ */
+export interface BranchUpdatedEvent {
+ action: 'branch_updated'
+ properties: {
+ /**
+ * The source of the update action
+ */
+ source: 'merge_page' | 'out_of_date_notice'
+ modifiedEdgeFunctions?: boolean
+ }
+ groups: TelemetryGroups
+}
+
+/**
+ * Triggered when a user clicks the review with assistant button for a merge.
+ *
+ * @group Events
+ * @source studio
+ * @page /dashboard/project/{ref}/merge
+ */
+export interface BranchReviewWithAssistantClickedEvent {
+ action: 'branch_review_with_assistant_clicked'
+ groups: TelemetryGroups
}
/**
@@ -1443,3 +1474,13 @@ export type TelemetryEvent =
| AiAssistantInSupportFormClickedEvent
| OrganizationMfaEnforcementUpdated
| ForeignDataWrapperCreatedEvent
+ | StorageBucketCreatedEvent
+ | BranchCreateButtonClickedEvent
+ | BranchDeleteButtonClickedEvent
+ | BranchCreateMergeRequestButtonClickedEvent
+ | BranchCloseMergeRequestButtonClickedEvent
+ | BranchMergeSubmittedEvent
+ | BranchMergeSucceededEvent
+ | BranchMergeFailedEvent
+ | BranchUpdatedEvent
+ | BranchReviewWithAssistantClickedEvent
diff --git a/packages/pg-meta/src/constants.ts b/packages/pg-meta/src/constants.ts
index c28ea770cc0..bb9513080a9 100644
--- a/packages/pg-meta/src/constants.ts
+++ b/packages/pg-meta/src/constants.ts
@@ -1 +1,2 @@
export const DEFAULT_SYSTEM_SCHEMAS = ['information_schema', 'pg_catalog', 'pg_toast']
+export const DEFAULT_PLATFORM_APPLICATION_NAME = 'supabase/dashboard'
diff --git a/packages/pg-meta/src/query/Query.utils.ts b/packages/pg-meta/src/query/Query.utils.ts
index ee39000b24d..47e2bb9f78f 100644
--- a/packages/pg-meta/src/query/Query.utils.ts
+++ b/packages/pg-meta/src/query/Query.utils.ts
@@ -1,5 +1,5 @@
-import { ident, literal, format } from '../pg-format'
-import type { Filter, QueryPagination, QueryTable, Sort, Dictionary } from './types'
+import { format, ident, literal } from '../pg-format'
+import type { Dictionary, Filter, QueryPagination, QueryTable, Sort } from './types'
export function countQuery(
table: QueryTable,
@@ -171,6 +171,11 @@ function applyFilters(query: string, filters: Filter[]) {
return inFilterSql(filter)
case 'is':
return isFilterSql(filter)
+ case '~~':
+ case '~~*':
+ case '!~~':
+ case '!~~*':
+ return castColumnToText(filter)
default:
return `${ident(filter.column)} ${filter.operator} ${filterLiteral(filter.value)}`
}
@@ -203,6 +208,10 @@ function isFilterSql(filter: Filter) {
}
}
+function castColumnToText(filter: Filter) {
+ return `${ident(filter.column)}::text ${filter.operator} ${filterLiteral(filter.value)}`
+}
+
function filterLiteral(value: any) {
if (typeof value === 'string') {
if (value?.startsWith('ARRAY[') && value?.endsWith(']')) {
diff --git a/packages/pg-meta/test/query/advanced-query.test.ts b/packages/pg-meta/test/query/advanced-query.test.ts
index 0af6aac201c..3abaf6dad79 100644
--- a/packages/pg-meta/test/query/advanced-query.test.ts
+++ b/packages/pg-meta/test/query/advanced-query.test.ts
@@ -1,6 +1,6 @@
-import { expect, test, describe, afterAll } from 'vitest'
+import { afterAll, describe, expect, test } from 'vitest'
import { Query } from '../../src/query/Query'
-import { createTestDatabase, cleanupRoot } from '../db/utils'
+import { cleanupRoot, createTestDatabase } from '../db/utils'
type TestDb = Awaited>
@@ -343,7 +343,7 @@ describe('Advanced Query Tests', () => {
.toSql()
expect(sql).toMatchInlineSnapshot(
- `"select id, name from public.normal_table where id > 10 and name ~~ '%John%' order by normal_table.name asc nulls last limit 10 offset 0;"`
+ `"select id, name from public.normal_table where id > 10 and name::text ~~ '%John%' order by normal_table.name asc nulls last limit 10 offset 0;"`
)
const result = await validateSql(db, sql)
@@ -444,7 +444,7 @@ describe('Advanced Query Tests', () => {
.toSql()
expect(sql).toMatchInlineSnapshot(
- '"select count(*) from public.normal_table where name ~~ \'%John%\';"'
+ '"select count(*) from public.normal_table where name::text ~~ \'%John%\';"'
)
const result = await validateSql(db, sql)
diff --git a/packages/pg-meta/test/query/query.test.ts b/packages/pg-meta/test/query/query.test.ts
index 57195757a1d..0302f41efc6 100644
--- a/packages/pg-meta/test/query/query.test.ts
+++ b/packages/pg-meta/test/query/query.test.ts
@@ -1,10 +1,10 @@
-import { expect, test, describe } from 'vitest'
+import { describe, expect, test } from 'vitest'
import { Query } from '../../src/query/Query'
+import * as QueryUtils from '../../src/query/Query.utils'
import { QueryAction } from '../../src/query/QueryAction'
import { QueryFilter } from '../../src/query/QueryFilter'
import { QueryModifier } from '../../src/query/QueryModifier'
-import * as QueryUtils from '../../src/query/Query.utils'
-import type { QueryTable, Filter, Sort } from '../../src/query/types'
+import type { Filter, QueryTable, Sort } from '../../src/query/types'
describe('Query', () => {
test('from() should create a QueryAction with the correct table', () => {
@@ -515,7 +515,9 @@ describe('End-to-end query chaining', () => {
.filter('name', '~~', '%John%')
.toSql()
- expect(sql).toBe("select id, name, email from public.users where id > 10 and name ~~ '%John%';")
+ expect(sql).toBe(
+ "select id, name, email from public.users where id > 10 and name::text ~~ '%John%';"
+ )
})
test('should correctly build a select query with match criteria', () => {
diff --git a/packages/pg-meta/test/query/table-row-query.test.ts b/packages/pg-meta/test/query/table-row-query.test.ts
index c72c98546c2..62645f9012a 100644
--- a/packages/pg-meta/test/query/table-row-query.test.ts
+++ b/packages/pg-meta/test/query/table-row-query.test.ts
@@ -1,8 +1,8 @@
-import { expect, test, describe, afterAll, beforeAll } from 'vitest'
-import { createTestDatabase, cleanupRoot } from '../db/utils'
+import { afterAll, beforeAll, describe, expect, test } from 'vitest'
import pgMeta from '../../src/index'
+import { Filter, Sort } from '../../src/query'
import { getDefaultOrderByColumns, getTableRowsSql } from '../../src/query/table-row-query'
-import { Sort, Filter } from '../../src/query'
+import { cleanupRoot, createTestDatabase } from '../db/utils'
beforeAll(async () => {
// Any global setup if needed
@@ -1098,7 +1098,7 @@ describe('Table Row Query', () => {
// Verify SQL generation with snapshot
expect(sql).toMatchInlineSnapshot(
`
- "with _base_query as (select * from public.test_sql_filter where name ~~ 'Test%' and category = 'A' order by test_sql_filter.id asc nulls last limit 10 offset 0)
+ "with _base_query as (select * from public.test_sql_filter where name::text ~~ 'Test%' and category = 'A' order by test_sql_filter.id asc nulls last limit 10 offset 0)
select id,case
when octet_length(name::text) > 10240
then left(name::text, 10240) || '...'
diff --git a/packages/shared-data/pricing.ts b/packages/shared-data/pricing.ts
index f5cce2fb715..8f5603aa739 100644
--- a/packages/shared-data/pricing.ts
+++ b/packages/shared-data/pricing.ts
@@ -421,8 +421,8 @@ export const pricing: Pricing = {
title: 'Max file upload size',
plans: {
free: '50 MB',
- pro: '50 GB',
- team: '50 GB',
+ pro: '500 GB',
+ team: '500 GB',
enterprise: 'Custom',
},
usage_based: false,
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index fb38e657844..de23cd1f79c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -189,7 +189,7 @@ importers:
version: 15.3.1(@babel/core@7.26.10(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)
next-contentlayer2:
specifier: 0.4.6
- version: 0.4.6(contentlayer2@0.4.6(esbuild@0.25.2)(markdown-wasm@1.2.0)(supports-color@8.1.1))(esbuild@0.25.2)(markdown-wasm@1.2.0)(next@15.3.1(@babel/core@7.26.10(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(supports-color@8.1.1)
+ version: 0.4.6(contentlayer2@0.4.6(esbuild@0.25.2)(markdown-wasm@1.2.0)(supports-color@8.1.1))(esbuild@0.25.2)(markdown-wasm@1.2.0)(next@15.3.1(@babel/core@7.26.10(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(supports-color@8.1.1)
next-themes:
specifier: ^0.3.0
version: 0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -615,6 +615,9 @@ importers:
shiki:
specifier: ^3.2.1
version: 3.2.1
+ shx:
+ specifier: ^0.4.0
+ version: 0.4.0
simple-git:
specifier: ^3.24.0
version: 3.24.0(supports-color@8.1.1)
@@ -730,11 +733,11 @@ importers:
specifier: npm:@jsr/std__path@^1.0.8
version: '@jsr/std__path@1.0.8'
'@stripe/react-stripe-js':
- specifier: ^3.1.1
- version: 3.1.1(@stripe/stripe-js@5.5.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ specifier: ^3.7.0
+ version: 3.7.0(@stripe/stripe-js@7.5.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@stripe/stripe-js':
- specifier: ^5.5.0
- version: 5.5.0
+ specifier: ^7.5.0
+ version: 7.5.0
'@supabase/auth-js':
specifier: 'catalog:'
version: 2.71.1-rc.1
@@ -1009,6 +1012,9 @@ importers:
specifier: ^4.4.2
version: 4.4.2
devDependencies:
+ '@faker-js/faker':
+ specifier: ^9.9.0
+ version: 9.9.0
'@graphql-codegen/cli':
specifier: 5.0.5
version: 5.0.5(@parcel/watcher@2.5.1)(@types/node@22.13.14)(encoding@0.1.13)(graphql-sock@1.0.1(graphql@16.11.0))(graphql@16.11.0)(supports-color@8.1.1)(typescript@5.5.2)
@@ -1132,6 +1138,9 @@ importers:
import-in-the-middle:
specifier: ^1.13.1
version: 1.13.1
+ jsdom-testing-mocks:
+ specifier: ^1.13.1
+ version: 1.13.1
msw:
specifier: ^2.3.0
version: 2.4.11(typescript@5.5.2)
@@ -1308,13 +1317,13 @@ importers:
version: 15.3.1(@babel/core@7.26.10(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4)
next-contentlayer2:
specifier: 0.4.6
- version: 0.4.6(contentlayer2@0.4.6(esbuild@0.25.2)(markdown-wasm@1.2.0)(supports-color@8.1.1))(esbuild@0.25.2)(markdown-wasm@1.2.0)(next@15.3.1(@babel/core@7.26.10(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(supports-color@8.1.1)
+ version: 0.4.6(contentlayer2@0.4.6(esbuild@0.25.2)(markdown-wasm@1.2.0)(supports-color@8.1.1))(esbuild@0.25.2)(markdown-wasm@1.2.0)(next@15.3.1(@babel/core@7.26.10(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(supports-color@8.1.1)
next-themes:
specifier: ^0.3.0
version: 0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
openai:
specifier: ^5.9.0
- version: 5.9.0(ws@8.18.1)(zod@3.23.8)
+ version: 5.9.0(ws@8.18.3)(zod@3.23.8)
openapi-fetch:
specifier: 0.12.4
version: 0.12.4
@@ -2181,7 +2190,7 @@ importers:
version: 6.6.3
'@testing-library/react':
specifier: ^16.0.0
- version: 16.0.0(@testing-library/dom@10.1.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ version: 16.0.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@types/lodash':
specifier: 4.17.5
version: 4.17.5
@@ -3656,6 +3665,10 @@ packages:
resolution: {integrity: sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==}
engines: {node: '>=14.0.0', npm: '>=6.0.0'}
+ '@faker-js/faker@9.9.0':
+ resolution: {integrity: sha512-OEl393iCOoo/z8bMezRlJu+GlRGlsKbUAN7jKB6LhnKoqKve5DXRpalbItIIcwnCjs1k/FOPjFzcA6Qn+H+YbA==}
+ engines: {node: '>=18.0.0', npm: '>=9.0.0'}
+
'@fal-works/esbuild-plugin-global-externals@2.1.2':
resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==}
@@ -8043,15 +8056,15 @@ packages:
'@stitches/core@1.2.8':
resolution: {integrity: sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==}
- '@stripe/react-stripe-js@3.1.1':
- resolution: {integrity: sha512-+JzYFgUivVD7koqYV7LmLlt9edDMAwKH7XhZAHFQMo7NeRC+6D2JmQGzp9tygWerzwttwFLlExGp4rAOvD6l9g==}
+ '@stripe/react-stripe-js@3.7.0':
+ resolution: {integrity: sha512-PYls/2S9l0FF+2n0wHaEJsEU8x7CmBagiH7zYOsxbBlLIHEsqUIQ4MlIAbV9Zg6xwT8jlYdlRIyBTHmO3yM7kQ==}
peerDependencies:
- '@stripe/stripe-js': ^1.44.1 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0
+ '@stripe/stripe-js': '>=1.44.1 <8.0.0'
react: '>=16.8.0 <20.0.0'
react-dom: '>=16.8.0 <20.0.0'
- '@stripe/stripe-js@5.5.0':
- resolution: {integrity: sha512-lkfjyAd34aeMpTKKcEVfy8IUyEsjuAT3t9EXr5yZDtdIUncnZpedl/xLV16Dkd4z+fQwixScsCCDxSMNtBOgpQ==}
+ '@stripe/stripe-js@7.5.0':
+ resolution: {integrity: sha512-Cq3KKe+G1o7PSBMbmrgpT2JgBeyH2THHr3RdIX2MqF7AnBuspIMgtZ3ktcCgP7kZsTMvnmWymr7zZCT1zeWbMw==}
engines: {node: '>=12.16'}
'@supabase/auth-js@2.71.1-rc.1':
@@ -8418,6 +8431,10 @@ packages:
resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==}
engines: {node: '>=18'}
+ '@testing-library/dom@10.4.0':
+ resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==}
+ engines: {node: '>=18'}
+
'@testing-library/jest-dom@6.6.3':
resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==}
engines: {node: '>=14', npm: '>=6', yarn: '>=1'}
@@ -9680,6 +9697,9 @@ packages:
peerDependencies:
ajv: 4.11.8 - 8
+ bezier-easing@2.1.0:
+ resolution: {integrity: sha512-gbIqZ/eslnUFC1tjEvtz0sgx+xTK20wDnYMIA27VA04R7w6xxXQPZDbibjA9DTWZRA2CXtwHykkVzlCaAJAZig==}
+
big-integer@1.6.51:
resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==}
engines: {node: '>=0.6'}
@@ -10373,6 +10393,9 @@ packages:
css-in-js-utils@3.1.0:
resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==}
+ css-mediaquery@0.1.2:
+ resolution: {integrity: sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q==}
+
css-select@5.1.0:
resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==}
@@ -11472,6 +11495,10 @@ packages:
resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==}
engines: {node: '>=18.0.0'}
+ execa@1.0.0:
+ resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==}
+ engines: {node: '>=6'}
+
execa@7.2.0:
resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==}
engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0}
@@ -11960,6 +11987,10 @@ packages:
resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==}
engines: {node: '>=10'}
+ get-stream@4.1.0:
+ resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==}
+ engines: {node: '>=6'}
+
get-stream@6.0.1:
resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
engines: {node: '>=10'}
@@ -12592,6 +12623,10 @@ packages:
resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
engines: {node: '>=12'}
+ interpret@1.4.0:
+ resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==}
+ engines: {node: '>= 0.10'}
+
intersection-observer@0.10.0:
resolution: {integrity: sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ==}
@@ -12873,6 +12908,10 @@ packages:
resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
engines: {node: '>= 0.4'}
+ is-stream@1.1.0:
+ resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==}
+ engines: {node: '>=0.10.0'}
+
is-stream@2.0.1:
resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
engines: {node: '>=8'}
@@ -13119,6 +13158,10 @@ packages:
jsbn@1.1.0:
resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==}
+ jsdom-testing-mocks@1.13.1:
+ resolution: {integrity: sha512-8BAsnuoO4DLGTf7LDbSm8fcx5CUHSv4h+bdUbwyt6rMYAXWjeHLRx9f8sYiSxoOTXy3S1e06pe87KER39o1ckA==}
+ engines: {node: '>=14'}
+
jsdom@20.0.3:
resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==}
engines: {node: '>=14'}
@@ -14501,6 +14544,10 @@ packages:
engines: {node: '>= 4'}
hasBin: true
+ npm-run-path@2.0.2:
+ resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==}
+ engines: {node: '>=4'}
+
npm-run-path@5.3.0:
resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -14763,6 +14810,10 @@ packages:
resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
engines: {node: '>= 0.4'}
+ p-finally@1.0.0:
+ resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==}
+ engines: {node: '>=4'}
+
p-limit@3.1.0:
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
engines: {node: '>=10'}
@@ -15876,6 +15927,10 @@ packages:
react: ^16.0.0 || ^17.0.0 || ^18.0.0
react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0
+ rechoir@0.6.2:
+ resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==}
+ engines: {node: '>= 0.10'}
+
redent@3.0.0:
resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
engines: {node: '>=8'}
@@ -16407,6 +16462,11 @@ packages:
shell-quote@1.8.1:
resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==}
+ shelljs@0.9.2:
+ resolution: {integrity: sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==}
+ engines: {node: '>=18'}
+ hasBin: true
+
shiki@1.6.0:
resolution: {integrity: sha512-P31ROeXcVgW/k3Z+vUUErcxoTah7ZRaimctOpzGuqAntqnnSmx1HOsvnbAB8Z2qfXPRhw61yptAzCsuKOhTHwQ==}
@@ -16434,6 +16494,11 @@ packages:
should@13.2.3:
resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==}
+ shx@0.4.0:
+ resolution: {integrity: sha512-Z0KixSIlGPpijKgcH6oCMCbltPImvaKy0sGH8AkLRXw1KyzpKtaCTizP2xen+hNDqVF4xxgvA0KXSb9o4Q6hnA==}
+ engines: {node: '>=18'}
+ hasBin: true
+
side-channel-list@1.0.0:
resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
engines: {node: '>= 0.4'}
@@ -16807,6 +16872,10 @@ packages:
resolution: {integrity: sha512-p9LsUieSjWNNAxVCXLeilaDlmuUOrDS5/dF9znM1nZc7EGX5+zEFC0bEevsNIaldjlks+2jns5Siz6F9iK6jwA==}
engines: {node: '>=0.10.0'}
+ strip-eof@1.0.0:
+ resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==}
+ engines: {node: '>=0.10.0'}
+
strip-final-newline@3.0.0:
resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
engines: {node: '>=12'}
@@ -18200,6 +18269,18 @@ packages:
utf-8-validate:
optional: true
+ ws@8.18.3:
+ resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+
xml-lexer@0.2.2:
resolution: {integrity: sha512-G0i98epIwiUEiKmMcavmVdhtymW+pCAohMRgybyIME9ygfVu8QheIi+YoQh3ngiThsT0SQzJT4R0sKDEv8Ou0w==}
@@ -20271,7 +20352,7 @@ snapshots:
'@contentlayer2/core': 0.5.3(esbuild@0.25.2)(markdown-wasm@1.2.0)(supports-color@8.1.1)
'@contentlayer2/utils': 0.5.3
chokidar: 3.5.3
- fast-glob: 3.3.2
+ fast-glob: 3.3.3
gray-matter: 4.0.3
imagescript: 1.3.0
micromatch: 4.0.8
@@ -20726,6 +20807,8 @@ snapshots:
'@faker-js/faker@7.6.0': {}
+ '@faker-js/faker@9.9.0': {}
+
'@fal-works/esbuild-plugin-global-externals@2.1.2': {}
'@fastify/ajv-compiler@3.6.0':
@@ -21387,10 +21470,10 @@ snapshots:
'@graphql-tools/utils': 10.8.6(graphql@16.10.0)
'@whatwg-node/disposablestack': 0.0.6
graphql: 16.10.0
- graphql-ws: 6.0.4(graphql@16.10.0)(ws@8.18.1)
- isomorphic-ws: 5.0.0(ws@8.18.1)
+ graphql-ws: 6.0.4(graphql@16.10.0)(ws@8.18.3)
+ isomorphic-ws: 5.0.0(ws@8.18.3)
tslib: 2.8.1
- ws: 8.18.1
+ ws: 8.18.3
transitivePeerDependencies:
- '@fastify/websocket'
- bufferutil
@@ -21403,10 +21486,10 @@ snapshots:
'@graphql-tools/utils': 10.8.6(graphql@16.11.0)
'@whatwg-node/disposablestack': 0.0.6
graphql: 16.11.0
- graphql-ws: 6.0.4(graphql@16.11.0)(ws@8.18.1)
- isomorphic-ws: 5.0.0(ws@8.18.1)
+ graphql-ws: 6.0.4(graphql@16.11.0)(ws@8.18.3)
+ isomorphic-ws: 5.0.0(ws@8.18.3)
tslib: 2.8.1
- ws: 8.18.1
+ ws: 8.18.3
transitivePeerDependencies:
- '@fastify/websocket'
- bufferutil
@@ -21448,9 +21531,9 @@ snapshots:
'@graphql-tools/utils': 10.8.6(graphql@16.10.0)
'@types/ws': 8.5.10
graphql: 16.10.0
- isomorphic-ws: 5.0.0(ws@8.18.1)
+ isomorphic-ws: 5.0.0(ws@8.18.3)
tslib: 2.8.1
- ws: 8.18.1
+ ws: 8.18.3
transitivePeerDependencies:
- bufferutil
- utf-8-validate
@@ -21460,9 +21543,9 @@ snapshots:
'@graphql-tools/utils': 10.8.6(graphql@16.11.0)
'@types/ws': 8.5.10
graphql: 16.11.0
- isomorphic-ws: 5.0.0(ws@8.18.1)
+ isomorphic-ws: 5.0.0(ws@8.18.3)
tslib: 2.8.1
- ws: 8.18.1
+ ws: 8.18.3
transitivePeerDependencies:
- bufferutil
- utf-8-validate
@@ -26875,14 +26958,14 @@ snapshots:
'@stitches/core@1.2.8': {}
- '@stripe/react-stripe-js@3.1.1(@stripe/stripe-js@5.5.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ '@stripe/react-stripe-js@3.7.0(@stripe/stripe-js@7.5.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@stripe/stripe-js': 5.5.0
+ '@stripe/stripe-js': 7.5.0
prop-types: 15.8.1
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- '@stripe/stripe-js@5.5.0': {}
+ '@stripe/stripe-js@7.5.0': {}
'@supabase/auth-js@2.71.1-rc.1':
dependencies:
@@ -26940,7 +27023,7 @@ snapshots:
'@supabase/node-fetch': 2.6.15
'@types/phoenix': 1.6.4
'@types/ws': 8.5.10
- ws: 8.18.1
+ ws: 8.18.3
transitivePeerDependencies:
- bufferutil
- utf-8-validate
@@ -26950,7 +27033,7 @@ snapshots:
'@supabase/node-fetch': 2.6.15
'@types/phoenix': 1.6.4
'@types/ws': 8.5.10
- ws: 8.18.1
+ ws: 8.18.3
transitivePeerDependencies:
- bufferutil
- utf-8-validate
@@ -27690,6 +27773,17 @@ snapshots:
lz-string: 1.5.0
pretty-format: 27.5.1
+ '@testing-library/dom@10.4.0':
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@babel/runtime': 7.26.10
+ '@types/aria-query': 5.0.2
+ aria-query: 5.3.0
+ chalk: 4.1.2
+ dom-accessibility-api: 0.5.16
+ lz-string: 1.5.0
+ pretty-format: 27.5.1
+
'@testing-library/jest-dom@6.6.3':
dependencies:
'@adobe/css-tools': 4.4.0
@@ -27710,6 +27804,16 @@ snapshots:
'@types/react': 18.3.3
'@types/react-dom': 18.3.0
+ '@testing-library/react@16.0.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ dependencies:
+ '@babel/runtime': 7.26.10
+ '@testing-library/dom': 10.4.0
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ optionalDependencies:
+ '@types/react': 18.3.3
+ '@types/react-dom': 18.3.0
+
'@testing-library/user-event@14.6.1(@testing-library/dom@10.1.0)':
dependencies:
'@testing-library/dom': 10.1.0
@@ -27723,7 +27827,7 @@ snapshots:
'@ts-morph/common@0.19.0':
dependencies:
- fast-glob: 3.3.2
+ fast-glob: 3.3.3
minimatch: 7.4.6
mkdirp: 2.1.6
path-browserify: 1.0.1
@@ -29238,6 +29342,8 @@ snapshots:
jsonpointer: 5.0.1
leven: 3.1.0
+ bezier-easing@2.1.0: {}
+
big-integer@1.6.51: {}
big.js@5.2.2: {}
@@ -30029,6 +30135,8 @@ snapshots:
dependencies:
hyphenate-style-name: 1.0.4
+ css-mediaquery@0.1.2: {}
+
css-select@5.1.0:
dependencies:
boolbase: 1.0.0
@@ -31174,6 +31282,16 @@ snapshots:
dependencies:
eventsource-parser: 3.0.2
+ execa@1.0.0:
+ dependencies:
+ cross-spawn: 6.0.6
+ get-stream: 4.1.0
+ is-stream: 1.1.0
+ npm-run-path: 2.0.2
+ p-finally: 1.0.0
+ signal-exit: 3.0.7
+ strip-eof: 1.0.0
+
execa@7.2.0:
dependencies:
cross-spawn: 7.0.6
@@ -31753,6 +31871,10 @@ snapshots:
get-stdin@8.0.0: {}
+ get-stream@4.1.0:
+ dependencies:
+ pump: 3.0.3
+
get-stream@6.0.1: {}
get-stream@8.0.1: {}
@@ -32057,12 +32179,19 @@ snapshots:
graphql: 16.10.0
optionalDependencies:
ws: 8.18.1
+ optional: true
- graphql-ws@6.0.4(graphql@16.11.0)(ws@8.18.1):
+ graphql-ws@6.0.4(graphql@16.10.0)(ws@8.18.3):
+ dependencies:
+ graphql: 16.10.0
+ optionalDependencies:
+ ws: 8.18.3
+
+ graphql-ws@6.0.4(graphql@16.11.0)(ws@8.18.3):
dependencies:
graphql: 16.11.0
optionalDependencies:
- ws: 8.18.1
+ ws: 8.18.3
graphql@16.10.0: {}
@@ -32674,6 +32803,8 @@ snapshots:
internmap@2.0.3: {}
+ interpret@1.4.0: {}
+
intersection-observer@0.10.0: {}
invariant@2.2.4:
@@ -32928,6 +33059,8 @@ snapshots:
dependencies:
call-bound: 1.0.4
+ is-stream@1.1.0: {}
+
is-stream@2.0.1: {}
is-stream@3.0.0: {}
@@ -33038,6 +33171,10 @@ snapshots:
dependencies:
ws: 8.18.1
+ isomorphic-ws@5.0.0(ws@8.18.3):
+ dependencies:
+ ws: 8.18.3
+
isomorphic.js@0.2.5: {}
istanbul-lib-coverage@3.2.2: {}
@@ -33159,6 +33296,11 @@ snapshots:
jsbn@1.1.0: {}
+ jsdom-testing-mocks@1.13.1:
+ dependencies:
+ bezier-easing: 2.1.0
+ css-mediaquery: 0.1.2
+
jsdom@20.0.3(supports-color@8.1.1):
dependencies:
abab: 2.0.6
@@ -33185,7 +33327,7 @@ snapshots:
whatwg-encoding: 2.0.0
whatwg-mimetype: 3.0.0
whatwg-url: 11.0.0
- ws: 8.18.1
+ ws: 8.18.3
xml-name-validator: 4.0.0
transitivePeerDependencies:
- bufferutil
@@ -34975,7 +35117,7 @@ snapshots:
neo-async@2.6.2: {}
- next-contentlayer2@0.4.6(contentlayer2@0.4.6(esbuild@0.25.2)(markdown-wasm@1.2.0)(supports-color@8.1.1))(esbuild@0.25.2)(markdown-wasm@1.2.0)(next@15.3.1(@babel/core@7.26.10(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(supports-color@8.1.1):
+ next-contentlayer2@0.4.6(contentlayer2@0.4.6(esbuild@0.25.2)(markdown-wasm@1.2.0)(supports-color@8.1.1))(esbuild@0.25.2)(markdown-wasm@1.2.0)(next@15.3.1(@babel/core@7.26.10(supports-color@8.1.1))(@opentelemetry/api@1.9.0)(@playwright/test@1.53.0)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.4))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(supports-color@8.1.1):
dependencies:
'@contentlayer2/core': 0.4.3(esbuild@0.25.2)(markdown-wasm@1.2.0)(supports-color@8.1.1)
'@contentlayer2/utils': 0.4.3
@@ -35329,6 +35471,10 @@ snapshots:
shell-quote: 1.8.1
string.prototype.padend: 3.1.5
+ npm-run-path@2.0.2:
+ dependencies:
+ path-key: 2.0.1
+
npm-run-path@5.3.0:
dependencies:
path-key: 4.0.0
@@ -35545,9 +35691,9 @@ snapshots:
transitivePeerDependencies:
- encoding
- openai@5.9.0(ws@8.18.1)(zod@3.23.8):
+ openai@5.9.0(ws@8.18.3)(zod@3.23.8):
optionalDependencies:
- ws: 8.18.1
+ ws: 8.18.3
zod: 3.23.8
openapi-fetch@0.12.4:
@@ -35643,6 +35789,8 @@ snapshots:
object-keys: 1.1.1
safe-push-apply: 1.0.0
+ p-finally@1.0.0: {}
+
p-limit@3.1.0:
dependencies:
yocto-queue: 0.1.0
@@ -36946,6 +37094,10 @@ snapshots:
tiny-invariant: 1.3.3
victory-vendor: 36.6.11
+ rechoir@0.6.2:
+ dependencies:
+ resolve: 1.22.10
+
redent@3.0.0:
dependencies:
indent-string: 4.0.0
@@ -37771,6 +37923,13 @@ snapshots:
shell-quote@1.8.1: {}
+ shelljs@0.9.2:
+ dependencies:
+ execa: 1.0.0
+ fast-glob: 3.3.3
+ interpret: 1.4.0
+ rechoir: 0.6.2
+
shiki@1.6.0:
dependencies:
'@shikijs/core': 1.6.0
@@ -37814,6 +37973,11 @@ snapshots:
should-type-adaptors: 1.1.0
should-util: 1.0.1
+ shx@0.4.0:
+ dependencies:
+ minimist: 1.2.8
+ shelljs: 0.9.2
+
side-channel-list@1.0.0:
dependencies:
es-errors: 1.3.0
@@ -38247,6 +38411,8 @@ snapshots:
strip-color@0.1.0: {}
+ strip-eof@1.0.0: {}
+
strip-final-newline@3.0.0: {}
strip-indent@3.0.0:
@@ -40030,6 +40196,8 @@ snapshots:
ws@8.18.1: {}
+ ws@8.18.3: {}
+
xml-lexer@0.2.2:
dependencies:
eventemitter3: 2.0.3
diff --git a/turbo.json b/turbo.json
index fe75e665de7..0e9c09686f0 100644
--- a/turbo.json
+++ b/turbo.json
@@ -61,6 +61,7 @@
"NEXT_PUBLIC_NODE_ENV",
"NEXT_PUBLIC_GOTRUE_URL",
"NEXT_PUBLIC_VERCEL_BRANCH_URL",
+ "NEXT_PUBLIC_GOOGLE_MAPS_KEY",
"NODE_ENV",
"SUPABASE_URL",
// These envs are used in the packages