/** * Schema Validator * Generated by schema/codegen.js * Schema version: 1 * DO NOT EDIT - regenerate with: yarn schema:codegen */ /** * Validate that a database has all required sync columns. * Works with any SQLite wrapper that supports PRAGMA table_info. * * @param {Function} getColumns - Function that takes table name and returns column names array * @returns {{ valid: boolean, missing: string[] }} Validation result */ export function validateSyncSchema(getColumns) { const required = { items: ["id","type","content","syncId","syncSource","syncedAt","createdAt","updatedAt","deletedAt"], tags: ["id","name","frequency","lastUsed","frecencyScore","createdAt","updatedAt"], item_tags: ["itemId","tagId","createdAt"], item_events: ["id","itemId","content","value","occurredAt","metadata","createdAt"], }; const missing = []; for (const [table, cols] of Object.entries(required)) { const actual = new Set(getColumns(table)); for (const col of cols) { if (!actual.has(col)) { missing.push(`${table}.${col}`); } } } return { valid: missing.length === 0, missing, }; } /** * Validate schema and throw if invalid. * @param {Function} getColumns - Function that takes table name and returns column names array * @throws {Error} If required columns are missing */ export function assertValidSyncSchema(getColumns) { const result = validateSyncSchema(getColumns); if (!result.valid) { throw new Error( `[schema] Required columns missing: ${result.missing.join(", ")}. ` + `Database may need migration. See schema/v1.json for canonical schema.` ); } } /** Schema version */ export const SCHEMA_VERSION = 1; /** Required sync columns by table */ export const REQUIRED_SYNC_COLUMNS = { items: ["id","type","content","syncId","syncSource","syncedAt","createdAt","updatedAt","deletedAt"], tags: ["id","name","frequency","lastUsed","frecencyScore","createdAt","updatedAt"], item_tags: ["itemId","tagId","createdAt"], item_events: ["id","itemId","content","value","occurredAt","metadata","createdAt"], };