Discover how ObjectQL's core engine achieves universal compatibility by eliminating all dependencies, enabling it to run anywhere from Node.js to browsers to edge functions.
One of ObjectQL's most distinctive architectural decisions is its zero-dependency core. The @objectql/core package has exactly zero dependencies on external npm packages and zero dependencies on Node.js native modules. This enables true universal compatibility.
Instead of importing libraries, @objectql/core implements algorithms in pure JavaScript:
// ❌ Don't do this (adds lodash dependency)import _ from 'lodash';const unique = _.uniq(array);// ✅ Do this (pure JavaScript)const unique = [...new Set(array)];
// ❌ Don't do this (adds uuid dependency)import { v4 as uuidv4 } from 'uuid';const id = uuidv4();// ✅ Do this (use driver's ID generator or pure JS)const id = crypto.randomUUID(); // Native in modern browsers & Node.js// Or: let driver generate IDs
// This query can be:const query = { object: 'project', filters: [{ field: 'status', operator: 'eq', value: 'active' }]};// ✅ Sent over HTTPfetch('/api/query', { method: 'POST', body: JSON.stringify(query)});// ✅ Stored in localStoragelocalStorage.setItem('savedQuery', JSON.stringify(query));// ✅ Passed to Web Workersworker.postMessage({ type: 'query', data: query });// ✅ Used in any JavaScript environment
import { Repository } from '@objectql/core';import { LocalStorageDriver } from '@objectql/driver-localstorage';// Schemas bundled with applicationimport schemas from './schemas.json';const driver = new LocalStorageDriver();const repository = new Repository({ driver, schemas });
// Import only what you needimport { Repository } from '@objectql/core';// Unused code is automatically removed by bundlers// Final bundle: ~50 KB instead of full package
// Mobile app with sync capabilityimport { Repository } from '@objectql/core';import { SQLiteDriver } from '@objectql/driver-sqlite-rn';import { SyncDriver } from '@objectql/driver-sync';// Local storageconst localDriver = new SQLiteDriver({ name: 'app.db' });const localRepo = new Repository({ driver: localDriver });// Remote API (when online)const remoteDriver = new SyncDriver({ url: 'https://api.example.com', token: userToken});const remoteRepo = new Repository({ driver: remoteDriver });// App code works with both identicallyasync function saveTask(task: Task) { // Save locally await localRepo.insert('task', task); // Sync to server when online if (navigator.onLine) { await remoteRepo.insert('task', task); }}
// Instead of: import Ajv from 'ajv'; (adds dependency)// Implement simple validation in pure JavaScriptfunction validateSchema(schema: ObjectSchema): void { if (!schema.name || typeof schema.name !== 'string') { throw new ValidationError('Schema must have a name'); } if (!schema.fields || typeof schema.fields !== 'object') { throw new ValidationError('Schema must have fields'); } for (const [fieldName, fieldSchema] of Object.entries(schema.fields)) { validateFieldSchema(fieldName, fieldSchema); }}
// Instead of: import cloneDeep from 'lodash/cloneDeep';// Use native structuredClone (available in modern JS)function deepClone<T>(obj: T): T { return structuredClone(obj);}
⚠️ Must implement features in-house - can't rely on external libraries
⚠️ Platform features require adapters - file system, crypto, etc.
⚠️ May reinvent some wheels - validation, parsing, etc.
However, these trade-offs are worthwhile for the benefits of universal compatibility.