v0.2.9
✨ Added
store.resource(db, table, opts)— declarative CRUD factory nested onstore. Expands into five ordinaryflow({…})s (list/create/get/update/remove) plusall(). Sugar overfx.store(db), never new physics; the ten exports stay unchanged.http.resource(path, ops)+on(mount)overload — mounts all five verbs (list/create onpath, get/update/remove onpath/:id) and returns the ops bag foradopt. Manifest extract expands the multi-bind statically.- Complete list URL (PostgREST-shaped, UTF-8 values — English, Arabic, …):
?cursor=/?offset=/?limit=·?search=(?q=alias) ·?col=op.value(eq ne gt gte lt lte like ilike in is) ·?or=(…)/?and=(…)·?order=col.desc·?select=id,title. Every surface is whitelisted by a ColumnScope ("all" | Column[] | "none"). fx.json.ok/create/empty/with— Stripe-style{ data, meta, error }envelope;create→ 201,empty→ 204, list pages attach top-levelmeta(nextCursor,hasNextPage, …).ClientResultand the in-process test client exposemeta.fx.store(db).page/.count, fluent.offset(), and condition-compiler support forinArray/isNull/isNotNull(memory driver matched).OkeOptions.registry?: "consume" | "keep" | "ignore"(defaultconsume) — isolates the process-wideon()bindings registry so a lateroke()cannot inherit another app’s routes. Console usesignore. Proven byregistry-isolation.test.ts.flow({ breaking: true })/store.resource({ breaking: true })— acknowledge intentional Manifest contract breaks foroke doctor --diff.
♻️ Changed
- Notes teaching app rewritten onto
store.resource+on(http.resource(…))with cursor pages, multilingual search, filter/order/select, and 201/204 status tests. Spec, Learn · Notes, Store element docs, README, and homepage snippet regenerated. - Export gzip baselines refreshed for the intentional
store.resource/ memory-driver growth (okengine,store,console,drivers,memory).
🐛 Fixed
- Latent
or(...)silently flattening into AND in the SQL condition compiler (parenthesized OR groups; unsupported ops throw). - Partial
update().set()no longer re-applies$defaultFnto untouched columns viaprepareInsertRow.