Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ type AnalyticsBucketValidationOptions = {
// Fields that are always required regardless of the namespace / access key selections.
const ANALYTICS_BUCKET_REQUIRED_FIELDS: AnalyticsBucketValidationIssue[] = [
{ path: 'warehouseName', message: 'Bucket is required' },
{ path: 's3Region', message: 'S3 Region is required' },
{ path: 's3AccessKeyId', message: 'S3 Access Key ID is required' },
{ path: 's3Region', message: 'S3 region is required' },
{ path: 's3AccessKeyId', message: 'S3 access key ID is required' },
]

export const getAnalyticsBucketValidationIssues = (
Expand Down Expand Up @@ -53,7 +53,7 @@ export const getAnalyticsBucketValidationIssues = (
data.s3SecretAccessKey?.trim().length &&
!data.s3AccessKeyId?.trim().length
) {
issues.push({ path: 's3AccessKeyId', message: 'S3 Access Key ID is required' })
issues.push({ path: 's3AccessKeyId', message: 'S3 access key ID is required' })
}

const currentS3AccessKeyId = data.s3AccessKeyId?.trim()
Expand All @@ -69,7 +69,7 @@ export const getAnalyticsBucketValidationIssues = (
(!options.secretsOptional || hasChangedStoredS3AccessKey) &&
!data.s3SecretAccessKey?.trim().length
) {
issues.push({ path: 's3SecretAccessKey', message: 'S3 Secret Access Key is required' })
issues.push({ path: 's3SecretAccessKey', message: 'S3 secret access key is required' })
}

return issues
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -255,7 +255,7 @@ export const AnalyticsBucketFields = ({
name="newNamespaceName"
render={({ field }) => (
<FormItemLayout
label="New Namespace Name"
label="New namespace name"
layout="horizontal"
description="A unique name for the new namespace"
>
Expand All @@ -273,7 +273,7 @@ export const AnalyticsBucketFields = ({
render={({ field }) => (
<FormItemLayout
layout="horizontal"
label="Catalog Token"
label="Catalog token"
description={
editMode ? (
'Stored catalog token is hidden and kept automatically.'
Expand Down Expand Up @@ -315,7 +315,7 @@ export const AnalyticsBucketFields = ({
render={({ field }) => (
<FormItemLayout
layout="horizontal"
label="S3 Access Key ID"
label="S3 access key ID"
description={
<div className="flex flex-col gap-y-2">
<p>
Expand Down Expand Up @@ -403,7 +403,7 @@ export const AnalyticsBucketFields = ({
render={({ field }) => (
<FormItemLayout
layout="horizontal"
label="S3 Secret Access Key"
label="S3 secret access key"
className="relative"
description={
editMode
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export type BigQueryValidationIssue = {
const BIGQUERY_REQUIRED_FIELDS: { path: BigQueryFieldPath; message: string }[] = [
{ path: 'projectId', message: 'Project ID is required' },
{ path: 'datasetId', message: 'Dataset ID is required' },
{ path: 'serviceAccountKey', message: 'Service Account Key is required' },
{ path: 'serviceAccountKey', message: 'Service account key is required' },
]

export const getBigQueryValidationIssues = (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ export const BigQueryFields = ({
render={({ field }) => (
<FormItemLayout
layout="horizontal"
label="Service Account Key"
label="Service account key"
description={
editMode
? 'Stored credentials are hidden. Enter new credentials to replace them.'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,27 @@ export const DestinationPanelFormSchema = z.object({
// Common fields
name: z.string().min(1, 'Name is required'),
publicationName: z.string().min(1, 'Publication is required'),
maxFillMs: z.number().min(1, 'Max Fill milliseconds should be greater than 0').int().optional(),
maxFillMs: z.number().min(1, 'Max fill milliseconds must be greater than 0').int().optional(),
maxTableSyncWorkers: z
.number()
.min(1, 'Max table sync workers should be greater than 0')
.min(1, 'Max table sync workers must be greater than 0')
.int()
.optional(),
maxCopyConnectionsPerTable: z
.number()
.int()
.min(1, 'Max copy connections per table should be greater than 0')
.min(1, 'Max copy connections per table must be greater than 0')
.optional(),
invalidatedSlotBehavior: z.enum(['error', 'recreate']).optional(),
// BigQuery fields
projectId: z.string().optional(),
datasetId: z.string().optional(),
serviceAccountKey: z.string().optional(),
connectionPoolSize: z.number().int().min(1).optional(),
connectionPoolSize: z
.number()
.int()
.min(1, 'Connection pool size must be greater than 0')
.optional(),
maxStalenessMins: z.number().nonnegative().optional(),
// Analytics Bucket fields, only warehouse name and namespace are visible + editable fields
warehouseName: z.string().optional(),
Expand All @@ -43,7 +47,12 @@ export const DestinationPanelFormSchema = z.object({
// DuckLake "Custom parameters" fields
ducklakeCatalogUrl: z.string().optional(),
ducklakeDataPath: z.string().optional(),
ducklakePoolSize: z.number().int().min(1).max(6).optional(),
ducklakePoolSize: z
.number()
.int()
.min(1, 'Pool size must be greater than 0')
.max(6, 'Pool size must be 6 or less')
.optional(),
ducklakeS3AccessKeyId: z.string().optional(),
ducklakeS3SecretAccessKey: z.string().optional(),
ducklakeS3Region: z.string().optional(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,10 +150,10 @@ describe('DestinationForm.utils DuckLake', () => {
expect(issues).toEqual([
{ path: 'ducklakeCatalogUrl', message: 'Catalog URL is required' },
{ path: 'ducklakeDataPath', message: 'Data path is required' },
{ path: 'ducklakeS3AccessKeyId', message: 'S3 Access Key ID is required' },
{ path: 'ducklakeS3SecretAccessKey', message: 'S3 Secret Access Key is required' },
{ path: 'ducklakeS3Region', message: 'S3 Region is required' },
{ path: 'ducklakeS3Endpoint', message: 'S3 Endpoint is required' },
{ path: 'ducklakeS3AccessKeyId', message: 'S3 access key ID is required' },
{ path: 'ducklakeS3SecretAccessKey', message: 'S3 secret access key is required' },
{ path: 'ducklakeS3Region', message: 'S3 region is required' },
{ path: 'ducklakeS3Endpoint', message: 'S3 endpoint is required' },
])
})

Expand Down Expand Up @@ -189,7 +189,7 @@ describe('DestinationForm.utils DuckLake', () => {
)

expect(issues).toEqual([
{ path: 'ducklakeS3SecretAccessKey', message: 'S3 Secret Access Key is required' },
{ path: 'ducklakeS3SecretAccessKey', message: 'S3 secret access key is required' },
])
})

Expand All @@ -207,10 +207,10 @@ describe('DestinationForm.utils DuckLake', () => {
expect(issues).toEqual([
{ path: 'ducklakeCatalogUrl', message: 'Catalog URL is required' },
{ path: 'ducklakeDataPath', message: 'Data path is required' },
{ path: 'ducklakeS3AccessKeyId', message: 'S3 Access Key ID is required' },
{ path: 'ducklakeS3SecretAccessKey', message: 'S3 Secret Access Key is required' },
{ path: 'ducklakeS3Region', message: 'S3 Region is required' },
{ path: 'ducklakeS3Endpoint', message: 'S3 Endpoint is required' },
{ path: 'ducklakeS3AccessKeyId', message: 'S3 access key ID is required' },
{ path: 'ducklakeS3SecretAccessKey', message: 'S3 secret access key is required' },
{ path: 'ducklakeS3Region', message: 'S3 region is required' },
{ path: 'ducklakeS3Endpoint', message: 'S3 endpoint is required' },
])
})

Expand All @@ -236,7 +236,7 @@ describe('DestinationForm.utils DuckLake', () => {
},
{
path: 'ducklakeS3Endpoint',
message: 'S3 endpoint should not contain the protocol scheme',
message: 'S3 endpoint must not contain the protocol scheme',
},
{
path: 'ducklakeMetadataSchema',
Expand Down Expand Up @@ -451,7 +451,7 @@ describe('DestinationForm.utils BigQuery', () => {
expect(issues).toEqual([
{ path: 'projectId', message: 'Project ID is required' },
{ path: 'datasetId', message: 'Dataset ID is required' },
{ path: 'serviceAccountKey', message: 'Service Account Key is required' },
{ path: 'serviceAccountKey', message: 'Service account key is required' },
])
})

Expand All @@ -465,7 +465,7 @@ describe('DestinationForm.utils BigQuery', () => {
expect(issues).toEqual([
{ path: 'projectId', message: 'Project ID is required' },
{ path: 'datasetId', message: 'Dataset ID is required' },
{ path: 'serviceAccountKey', message: 'Service Account Key is required' },
{ path: 'serviceAccountKey', message: 'Service account key is required' },
])
})

Expand Down Expand Up @@ -506,10 +506,10 @@ describe('DestinationForm.utils Analytics Bucket', () => {

expect(issues).toEqual([
{ path: 'warehouseName', message: 'Bucket is required' },
{ path: 's3Region', message: 'S3 Region is required' },
{ path: 's3AccessKeyId', message: 'S3 Access Key ID is required' },
{ path: 's3Region', message: 'S3 region is required' },
{ path: 's3AccessKeyId', message: 'S3 access key ID is required' },
{ path: 'namespace', message: 'Namespace is required' },
{ path: 's3SecretAccessKey', message: 'S3 Secret Access Key is required' },
{ path: 's3SecretAccessKey', message: 'S3 secret access key is required' },
])
})

Expand All @@ -525,10 +525,10 @@ describe('DestinationForm.utils Analytics Bucket', () => {

expect(issues).toEqual([
{ path: 'warehouseName', message: 'Bucket is required' },
{ path: 's3Region', message: 'S3 Region is required' },
{ path: 's3AccessKeyId', message: 'S3 Access Key ID is required' },
{ path: 's3Region', message: 'S3 region is required' },
{ path: 's3AccessKeyId', message: 'S3 access key ID is required' },
{ path: 'namespace', message: 'Namespace is required' },
{ path: 's3SecretAccessKey', message: 'S3 Secret Access Key is required' },
{ path: 's3SecretAccessKey', message: 'S3 secret access key is required' },
])
})

Expand Down Expand Up @@ -604,7 +604,7 @@ describe('DestinationForm.utils Analytics Bucket', () => {
)

expect(issues).toEqual([
{ path: 's3SecretAccessKey', message: 'S3 Secret Access Key is required' },
{ path: 's3SecretAccessKey', message: 'S3 secret access key is required' },
])
})

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,10 @@ const DUCKLAKE_SUPABASE_REQUIRED_FIELDS: DucklakeValidationIssue[] = [
const DUCKLAKE_CUSTOM_REQUIRED_FIELDS: DucklakeValidationIssue[] = [
{ path: 'ducklakeCatalogUrl', message: 'Catalog URL is required' },
{ path: 'ducklakeDataPath', message: 'Data path is required' },
{ path: 'ducklakeS3AccessKeyId', message: 'S3 Access Key ID is required' },
{ path: 'ducklakeS3SecretAccessKey', message: 'S3 Secret Access Key is required' },
{ path: 'ducklakeS3Region', message: 'S3 Region is required' },
{ path: 'ducklakeS3Endpoint', message: 'S3 Endpoint is required' },
{ path: 'ducklakeS3AccessKeyId', message: 'S3 access key ID is required' },
{ path: 'ducklakeS3SecretAccessKey', message: 'S3 secret access key is required' },
{ path: 'ducklakeS3Region', message: 'S3 region is required' },
{ path: 'ducklakeS3Endpoint', message: 'S3 endpoint is required' },
]

const DUCKLAKE_CUSTOM_SECRET_FIELDS = new Set<DucklakeFieldPath>([
Expand Down Expand Up @@ -113,7 +113,7 @@ export const getDucklakeValidationIssues = (
) {
issues.push({
path: 'ducklakeS3AccessKeyId',
message: 'S3 Access Key ID is required',
message: 'S3 access key ID is required',
})
}

Expand All @@ -124,7 +124,7 @@ export const getDucklakeValidationIssues = (
) {
issues.push({
path: 'ducklakeS3SecretAccessKey',
message: 'S3 Secret Access Key is required',
message: 'S3 secret access key is required',
})
}

Expand Down Expand Up @@ -157,7 +157,7 @@ export const getDucklakeValidationIssues = (
) {
issues.push({
path: 'ducklakeS3Endpoint',
message: 'S3 endpoint should not contain the protocol scheme',
message: 'S3 endpoint must not contain the protocol scheme',
})
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -476,7 +476,7 @@ const DuckLakeCustomFields = ({
render={({ field }) => (
<FormItemLayout
layout="horizontal"
label="S3 Access Key ID"
label="S3 access key ID"
description={
editMode
? 'Stored access key ID is hidden. Enter a new key ID to replace it.'
Expand All @@ -500,7 +500,7 @@ const DuckLakeCustomFields = ({
render={({ field }) => (
<FormItemLayout
layout="horizontal"
label="S3 Secret Access Key"
label="S3 secret access key"
description={
editMode
? 'Stored secret access key is hidden. Enter a new secret to replace it.'
Expand Down Expand Up @@ -532,7 +532,7 @@ const DuckLakeCustomFields = ({
render={({ field }) => (
<FormItemLayout
layout="horizontal"
label="S3 Region"
label="S3 region"
description="Required region for the object storage provider"
>
<FormControl>
Expand All @@ -548,7 +548,7 @@ const DuckLakeCustomFields = ({
render={({ field }) => (
<FormItemLayout
layout="horizontal"
label="S3 Endpoint"
label="S3 endpoint"
description="Required endpoint without the protocol scheme, for example `127.0.0.1:5000/s3`"
>
<FormControl>
Expand Down
Loading
Loading