Skip to content

Defining Resources

Use @Resource to define a resource schema and @field to define its fields. Put each schema in its own file under a schemas directory.

ts
// app/schemas/user.ts
import { Resource, field } from '@warp-drive/schema-dsl';

@Resource
class User {
  @field declare firstName: string;
  @field declare lastName: string;
  @field declare email: string;
}

At build time, the Vite plugin reads these files and produces the equivalent of calling withDefaults by hand — you just write the class.

Setup

Add the plugin to your Vite config, pointing it at your schema files:

ts
// vite.config.ts
import { schemaDSL } from '@warp-drive/schema-dsl/vite';

export default defineConfig({
  plugins: [
    schemaDSL({
      schemas: 'app/schemas/**/*.ts',
    }),
  ],
});

Then import and register the compiled output:

ts
import schemas from 'virtual:warp-drive-schemas';

registerDerivations(store.schema);
store.schema.registerResources(schemas);

Type Name

The resource type is derived from the class name:

  • User'user'
  • UserProfile'user-profile'

Override with a string argument:

ts
@Resource('person')
class User {
  @field declare name: string;
}

Field Options

ts
@field({ type: 'date-time' })
declare createdAt: Date;

@field({ sourceKey: 'email_address' })
declare email: string;

Custom Identity

Use @id when your identity field isn't id:

ts
import { Resource, field, id } from '@warp-drive/schema-dsl';

@Resource
class User {
  @id declare uuid: string;
  @field declare name: string;
}

Legacy Mode

For apps using @warp-drive/legacy/model:

ts
@Resource({ legacy: true })
class Post {
  @field declare title: string;
}

Released under the MIT License.