Config Schema
The sl.config.ts file declares your entire SemiLayer setup. The defineConfig helper
provides type-safety and IDE autocomplete.
Copy
import { defineConfig } from '@semilayer/core'
export default defineConfig ({
stack : 'my-app' ,
sources : { ... },
lenses : { ... },
auth ?: { ... },
})
Copy
sources : {
[name : string ]: {
bridge : string
}
}
Example:
Copy
sources : {
'main-db' : {
bridge : '@semilayer/bridge-postgres' ,
},
}
Copy
lenses : {
[name : string ]: {
source : string
table : string
primaryKey ?: string
fields : {
[fieldName : string ]: FieldConfig
}
facets ?: {
search ?: FacetConfig
similar ?: FacetConfig
query ?: QueryFacetConfig
}
syncInterval ?: SyncInterval
changeTrackingColumn ?: string
rules ?: AccessRules
}
}
Copy
interface FieldConfig {
type : 'text' | 'number' | 'boolean' | 'date' | 'json' | 'enum' | 'relation'
searchable ?: boolean | { weight : number }
primaryKey ?: boolean
from ?: string
transform ?: TransformSpec | TransformSpec []
}
Transform Options Description lowercase— Convert to lowercase uppercase— Convert to uppercase trim— Strip leading/trailing whitespace truncate{ length: number }Truncate string to N characters slugify— Convert to URL-safe slug round{ decimals?: number }Round number floor— Floor number ceil— Ceil number multiply{ by: number }Multiply number divide{ by: number }Divide number default{ value: unknown }Use value if source is null/undefined prefix{ value: string }Prepend string suffix{ value: string }Append string replace{ from: string; to: string }String replace
Chain multiple transforms as an array:
Copy
price : {
type : 'number' ,
from : 'price_cents' ,
transform : [
{ type : 'divide' , by : 100 },
{ type : 'round' , decimals : 2 },
],
},
Copy
interface FacetConfig {
fields : string []
}
Copy
facets : {
search : { fields : ['name' , 'description' , 'tags' ] },
similar : { fields : ['name' , 'description' ] },
}
Copy
'1m' | '5m' | '15m' | '30m' | '1h' | '6h' | '24h'
Copy
interface AccessRules {
search ?: RuleConfig
similar ?: RuleConfig
query ?: RuleConfig | false
subscribe ?: RuleConfig
allowOrigins ?: string []
}
interface RuleConfig {
allowPublicKey ?: boolean
userClaim ?: string
userClaimValue ?: unknown
}
Copy
auth ?: {
jwksUrl ?: string
issuer ?: string
audience ?: string
}
Used when passing user JWTs (X-User-Token header) for per-user access rules.
Copy
import { defineConfig } from '@semilayer/core'
export default defineConfig ({
stack : 'my-store' ,
sources : {
'main-db' : {
bridge : '@semilayer/bridge-postgres' ,
},
},
lenses : {
products : {
source : 'main-db' ,
table : 'public.products' ,
primaryKey : 'id' ,
fields : {
id : { type : 'number' , primaryKey : true },
name : { type : 'text' , searchable : { weight : 3 } },
description : { type : 'text' , searchable : true },
category : { type : 'text' },
price : { type : 'number' },
inStock : { type : 'boolean' , from : 'in_stock' },
slug : { type : 'text' , from : 'name' , transform : { type : 'slugify' } },
},
facets : {
search : { fields : ['name' , 'description' ] },
similar : { fields : ['name' , 'description' ] },
},
syncInterval : '15m' ,
changeTrackingColumn : 'updated_at' ,
rules : {
search : { allowPublicKey : true },
similar : { allowPublicKey : true },
query : { allowPublicKey : false },
},
},
},
auth : {
jwksUrl : 'https://your-auth-provider.com/.well-known/jwks.json' ,
issuer : 'https://your-auth-provider.com/' ,
audience : 'your-api-audience' ,
},
})