Welcome to Crudify, the lightweight JavaScript SDK from Crudify.io for interacting with the Crudify GraphQL API. This library lets you easily perform authentication, permission checks, and all CRUD operations (Create, Read, Update, Delete), as well as transactional batch operations against your serverless backend.
For full documentation and advanced guides, visit our docs at https://crudify.io/docs.
- Simple, chainable API
- Built-in authentication and token handling
- Single-call GraphQL mutations and queries
- Transaction support for batched operations
- Configurable log levels (
none
,debug
)
Result Statuses:
- Success (no warnings): operation completed without warnings; all fields processed correctly.
-
Success (with warnings): operation succeeded but some fields generated warnings; review the
fieldsWarning
array. -
Failure: operation failed; check the
errors
object for validation or processing errors.
Install via npm:
npm install @nocios/crudify
Import and initialize the SDK with your public API key (available at https://crudify.io) and optional log level:
import crudify from "@nocios/crudify";
// Initialize with your subscriber public key; logLevel defaults to 'debug'
crudify.init("YOUR_PUBLIC_API_KEY", "info");
Description:
Authenticate a user and store the returned JWT token internally.
const result = await crudify.login("user@example.com", "SuperSecret123!");
Sample Response (Success):
{ "success": true }
Sample Response (Error):
{ "success": false, "errors": [{ "message": "Invalid credentials" }] }
Description:
Fetch the current user’s permissions as an array of modules, each with its list of policy objects.
const perm = await crudify.getPermissions();
console.log(perm.data);
Sample Response:
{
"success": true,
"data": [
{
"moduleKey": "profiles",
"policies": [
{ "name": "Read", "action": "read", "conditions": "*", "position": "row" },
{ "name": "Create", "action": "create", "conditions": "*", "position": "header" },
{ "name": "Update", "action": "update", "conditions": "*", "position": "row" },
{ "name": "Delete", "action": "delete", "conditions": "*", "position": "row" }
]
}
// ...
]
}
All operations accept a moduleKey
string (the name of your resource/module) and a data
object. Responses follow the same pattern:
interface ResponseType {
success: boolean;
data?: any;
errors?: any;
}
Method: createItem(moduleKey: string, data: any): Promise<ResponseType>
Description:
Create a new record in the given module.
const newUser = { name: "Alice", email: "alice@example.com" };
const res = await crudify.createItem("users", newUser);
Sample Response:
{
"success": true,
"data": {
"_id": "5f8f8c44b54764421b7156c7",
"name": "Alice",
"email": "alice@example.com"
}
}
Method: readItem(moduleKey: string, data: { _id: string }): Promise<ResponseType>
Description:
Fetch a single record by its _id
.
const res = await crudify.readItem("users", { _id: "5f8f8c44b54764421b7156c7" });
Method: readItems(moduleKey: string, data: any): Promise<ResponseType>
Description:
Query multiple records with optional filters, sort, pagination, etc.
// Example: fetch all users
const res = await crudify.readItems("users", {});
Method: updateItem(moduleKey: string, data: any): Promise<ResponseType>
Description:
Update fields of an existing record. Must include _id
in data
.
const update = { _id: "...", name: "Alice Smith" };
const res = await crudify.updateItem("users", update);
Method: deleteItem(moduleKey: string, data: { _id: string }): Promise<ResponseType>
Description:
Remove a record by its _id
.
const res = await crudify.deleteItem("users", { _id: "..." });
Description:
Execute multiple operations in a single atomic batch. Each item in the data
array must be an object with:
-
operation
: one of'create' | 'update' | 'delete'
-
moduleKey
: the target module name -
data
: payload for the operation
const batch = [
{ operation: "create", moduleKey: "users", data: { name: "Carol" } },
{ operation: "update", moduleKey": "users", data: { _id: "...", name: "Carol Lee" } },
{ operation: "delete", moduleKey: "users", data: { _id: "..." } },
];
const res = await crudify.transaction(batch);
Below is a list of common field validation rules enforced by the SDK (via server-side Zod schemas). Each rule returns a specific error code when validation fails.
Rule | Description | Error Code |
---|---|---|
required |
Field must be present and non-empty | REQUIRED |
email |
Field must be a valid email address | INVALID_EMAIL |
noSpace |
Field must not contain whitespace | NO_SPACES |
min[x] |
Numeric field must be ≥ x | MIN_x |
max[x] |
Numeric field must be ≤ x | MAX_x |
minlength[x] |
String length must be ≥ x characters | MIN_x_CHARACTERS |
maxlength[x] |
String length must be ≤ x characters | MAX_x_CHARACTERS |
objectId |
Must be a valid MongoDB ObjectId | INVALID_OBJECT_ID |
in[...] |
String must be one of the provided values | INVALID_VALUE_MUST_BE_ONE_OF_[...] |
foreign:Module |
Must reference an existing non-deleted item in Module
|
FOREIGN_KEY_NOT_FOUND_<FIELD> |
unique:Module |
Value must be unique within Module (excluding current record) |
DUPLICATE_<FIELD> |
optional |
Field is not required | (no error on missing field) |
Successful (no warnings):
{
success: true,
data: { /* created record */ },
fieldsWarning: null
}
Q: What is publicApiKey
vs. apiKey
?
A: publicApiKey
is your subscriber-level credential, set via init()
. Internally the library uses a fixed GraphQL API key (apiKey
) to sign requests; you never need to configure it manually.
For more details and advanced usage, visit our docs at https://crudify.io/docs.