Lint and storage
Install the Oxlint plugin
Section titled “Install the Oxlint plugin”npm install -D oxlint @durability/lintAdd the plugin to .oxlintrc.json:
{ "jsPlugins": [ { "name": "durability", "specifier": "@durability/lint" } ], "rules": { "durability/alarm-runner-only": "error", "durability/durability-migrations-only": "error" }}alarm-runner-only
Section titled “alarm-runner-only”A class using createDurability must delegate its platform alarm directly:
class ImageJobs extends DurableObject<Env> { private readonly durability = createDurability(this.ctx, handlers);
alarm(info?: AlarmInvocationInfo) { return this.durability.alarm(info); }}Additional alarm work can replace or delay the one physical alarm Durability owns. Model it as a named alarm instead.
durability-migrations-only
Section titled “durability-migrations-only”Static CREATE TABLE statements must live in a reversible migration list typed with DurableMigrations:
npm install @durability/storageimport type { DurableMigrations } from '@durability/storage';
export const migrations = [ { name: '0001_create_jobs', up: ` CREATE TABLE jobs ( id TEXT PRIMARY KEY, payload TEXT NOT NULL ); `, down: 'DROP TABLE jobs;', },] satisfies DurableMigrations;Each library should use a namespaced migration-history table. The lint rule requires workers-qb DOQB builders to specify one:
const builder = new DOQB(this.ctx.storage.sql).migrations({ migrations, tableName: 'my_library_migrations',});@durability/storage contains the shared migration contract and no scheduler runtime. Use it for application or library migrations even when the main durability package does not own those tables.