Config System
The config system is the heart of OpenSaaS Stack. Define your entire schema, access control, and behavior in one place.
Basic Config
typescript
import { config, list } from '@opensaas/stack-core/config'
import { text, relationship } from '@opensaas/stack-core/fields'
export default config({
db: {
provider: 'sqlite',
url: 'file:./dev.db',
},
lists: {
Post: list({
fields: {
title: text({ validation: { isRequired: true } }),
author: relationship({ ref: 'User.posts' }),
},
access: {
operation: {
query: () => true,
create: ({ session }) => !!session?.userId,
},
},
}),
},
})
Config Options
Database Configuration
typescript
db: {
provider: 'sqlite' | 'postgresql' | 'mysql',
url: string,
prismaClientConstructor?: (PrismaClient: any) => PrismaClient,
}
Lists Configuration
Lists are your database models:
typescript
lists: {
[ListName: string]: list({
fields: { /* field definitions */ },
access: { /* access control */ },
hooks: { /* hooks */ },
ui: { /* UI options */ },
})
}
List Options
Fields
Define your schema using field types:
typescript
fields: {
title: text({ validation: { isRequired: true } }),
content: text(),
publishedAt: timestamp(),
author: relationship({ ref: 'User.posts' }),
}
See Field Types for all available types.
Access Control
Control who can perform operations:
typescript
access: {
operation: {
query: true,
create: ({ session }) => !!session?.userId,
update: ({ session, item }) => session?.userId === item.authorId,
delete: ({ session, item }) => session?.userId === item.authorId,
},
}
See Access Control for details.
Hooks
Transform data and trigger side effects:
typescript
hooks: {
resolveInput: async ({ resolvedData }) => {
if (resolvedData.status === 'published' && !resolvedData.publishedAt) {
resolvedData.publishedAt = new Date()
}
return resolvedData
},
}
See Hooks for details.
Next Steps
- Field Types - Available field types
- Access Control - Secure your data
- Hooks - Data transformation