
Security News
Vite+ Joins the Push to Consolidate JavaScript Tooling
Evan You announces Vite+, a commercial, Rust-powered toolchain built on the Vite ecosystem to unify JavaScript development and fund open source.
@solid-primitives/db-store
Advanced tools
A primitive that creates a synchronized store from a database:
createDbStore
- creates a store synchronized to a database.
supabaseAdapter
- adapter for supabase database connections to synchronize stores from.
npm install @solid-primitives/db-store
# or
yarn add @solid-primitives/db-store
# or
pnpm add @solid-primitives/db-store
const [dbStore, setDbStore] = createDbStore({
adapter: supabaseAdapter(client),
table: "todos",
defaultFields: ['id', 'userid']
filter: ({ userid }) => userid === user.id,
onError: handleErrors,
});
The store is automatically initialized and optimistically updated both ways. Due to how databases work, the store can only ever contain an array of entries.
[!WARNING] Since the order of items in the database cannot be guaranteed, the same is true for the items in the store.
[!NOTE] It can take some time for the database editor to show updates. They are processed a lot faster.
The id
field needs to be set by the database, so even if you set it, it needs to be overwritten in any case. There might be other fields that the server sets by default, e.g. a user ID. It is not required to set those for your rows manually; one can also treat its absence as a sign that an insertion is not yet done in the database.
By default, only 'id' is handled as default field. If you have additional default fields, you need to use the defaultField
option to convey them; otherwise default fields not set by the client might break the reconciliation of newly added fields.
If any change could not be successfully committed to the database, the onError
handler is called with an Error. If the caught error was an error itself, it is used directly, else what was encountered will be set as cause for an Error "unknown error". The error will also be augmented with a "data" property containing the update, an "action" property containing "insert", "update" or "delete" and a "server" flag property that is true if the error happened while sending data to the server.
Your adapter must have the following properties:
export type DbAdapterUpdate<Row extends DbRow> = { old?: Partial<Row>; new?: Partial<Row> };
export type DbAdapter<Row> = {
insertSignal: () => DbAdapterUpdate<Row> | undefined;
updateSignal: () => DbAdapterUpdate<Row> | undefined;
deleteSignal: () => DbAdapterUpdate<Row> | undefined;
init: () => Promise<Row[]>;
insert: (data: DbAdapterUpdate<Row>) => PromiseLike<any>;
update: (data: DbAdapterUpdate<Row>) => PromiseLike<any>;
delete: (data: DbAdapterUpdate<Row>) => PromiseLike<any>;
};
Working demonstration (requires Supabase account)
See CHANGELOG.md
This is an early draft; in the future, more adapters are planned: mongodb, prism, firebase, aws?
FAQs
A template primitive example.
We found that @solid-primitives/db-store demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 3 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Evan You announces Vite+, a commercial, Rust-powered toolchain built on the Vite ecosystem to unify JavaScript development and fund open source.
Security News
Ruby Central’s incident report on the RubyGems.org access dispute sparks backlash from former maintainers and renewed debate over project governance.
Research
/Security News
Socket researchers uncover how threat actors weaponize Discord across the npm, PyPI, and RubyGems ecosystems to exfiltrate sensitive data.