5 changed files with 320 additions and 81 deletions
			
			
		@ -0,0 +1,153 @@ | 
				
			|||
--- | 
				
			|||
description:  | 
				
			|||
globs:  | 
				
			|||
alwaysApply: true | 
				
			|||
--- | 
				
			|||
# Absurd SQL - Cursor Development Guide | 
				
			|||
 | 
				
			|||
## Project Overview | 
				
			|||
Absurd SQL is a backend implementation for sql.js that enables persistent SQLite databases in the browser by using IndexedDB as a block storage system. This guide provides rules and best practices for developing with this project in Cursor. | 
				
			|||
 | 
				
			|||
## Project Structure | 
				
			|||
``` | 
				
			|||
absurd-sql/ | 
				
			|||
├── src/               # Source code | 
				
			|||
├── dist/             # Built files | 
				
			|||
├── package.json      # Dependencies and scripts | 
				
			|||
├── rollup.config.js  # Build configuration | 
				
			|||
└── jest.config.js    # Test configuration | 
				
			|||
``` | 
				
			|||
 | 
				
			|||
## Development Rules | 
				
			|||
 | 
				
			|||
### 1. Worker Thread Requirements | 
				
			|||
- All SQL operations MUST be performed in a worker thread | 
				
			|||
- Main thread should only handle worker initialization and communication | 
				
			|||
- Never block the main thread with database operations | 
				
			|||
 | 
				
			|||
### 2. Code Organization | 
				
			|||
- Keep worker code in separate files (e.g., `*.worker.js`) | 
				
			|||
- Use ES modules for imports/exports | 
				
			|||
- Follow the project's existing module structure | 
				
			|||
 | 
				
			|||
### 3. Required Headers | 
				
			|||
When developing locally or deploying, ensure these headers are set: | 
				
			|||
``` | 
				
			|||
Cross-Origin-Opener-Policy: same-origin | 
				
			|||
Cross-Origin-Embedder-Policy: require-corp | 
				
			|||
``` | 
				
			|||
 | 
				
			|||
### 4. Browser Compatibility | 
				
			|||
- Primary target: Modern browsers with SharedArrayBuffer support | 
				
			|||
- Fallback mode: Safari (with limitations) | 
				
			|||
- Always test in both modes | 
				
			|||
 | 
				
			|||
### 5. Database Configuration | 
				
			|||
Recommended database settings: | 
				
			|||
```sql | 
				
			|||
PRAGMA journal_mode=MEMORY; | 
				
			|||
PRAGMA page_size=8192;  -- Optional, but recommended | 
				
			|||
``` | 
				
			|||
 | 
				
			|||
### 6. Development Workflow | 
				
			|||
1. Install dependencies: | 
				
			|||
   ```bash | 
				
			|||
   yarn add @jlongster/sql.js absurd-sql | 
				
			|||
   ``` | 
				
			|||
 | 
				
			|||
2. Development commands: | 
				
			|||
   - `yarn build` - Build the project | 
				
			|||
   - `yarn jest` - Run tests | 
				
			|||
   - `yarn serve` - Start development server | 
				
			|||
 | 
				
			|||
### 7. Testing Guidelines | 
				
			|||
- Write tests for both SharedArrayBuffer and fallback modes | 
				
			|||
- Use Jest for testing | 
				
			|||
- Include performance benchmarks for critical operations | 
				
			|||
 | 
				
			|||
### 8. Performance Considerations | 
				
			|||
- Use bulk operations when possible | 
				
			|||
- Monitor read/write performance | 
				
			|||
- Consider using transactions for multiple operations | 
				
			|||
- Avoid unnecessary database connections | 
				
			|||
 | 
				
			|||
### 9. Error Handling | 
				
			|||
- Implement proper error handling for: | 
				
			|||
  - Worker initialization failures | 
				
			|||
  - Database connection issues | 
				
			|||
  - Concurrent access conflicts (in fallback mode) | 
				
			|||
  - Storage quota exceeded scenarios | 
				
			|||
 | 
				
			|||
### 10. Security Best Practices | 
				
			|||
- Never expose database operations directly to the client | 
				
			|||
- Validate all SQL queries | 
				
			|||
- Implement proper access controls | 
				
			|||
- Handle sensitive data appropriately | 
				
			|||
 | 
				
			|||
### 11. Code Style | 
				
			|||
- Follow ESLint configuration | 
				
			|||
- Use async/await for asynchronous operations | 
				
			|||
- Document complex database operations | 
				
			|||
- Include comments for non-obvious optimizations | 
				
			|||
 | 
				
			|||
### 12. Debugging | 
				
			|||
- Use `jest-debug` for debugging tests | 
				
			|||
- Monitor IndexedDB usage in browser dev tools | 
				
			|||
- Check worker communication in console | 
				
			|||
- Use performance monitoring tools | 
				
			|||
 | 
				
			|||
## Common Patterns | 
				
			|||
 | 
				
			|||
### Worker Initialization | 
				
			|||
```javascript | 
				
			|||
// Main thread | 
				
			|||
import { initBackend } from 'absurd-sql/dist/indexeddb-main-thread'; | 
				
			|||
 | 
				
			|||
function init() { | 
				
			|||
  let worker = new Worker(new URL('./index.worker.js', import.meta.url)); | 
				
			|||
  initBackend(worker); | 
				
			|||
} | 
				
			|||
``` | 
				
			|||
 | 
				
			|||
### Database Setup | 
				
			|||
```javascript | 
				
			|||
// Worker thread | 
				
			|||
import initSqlJs from '@jlongster/sql.js'; | 
				
			|||
import { SQLiteFS } from 'absurd-sql'; | 
				
			|||
import IndexedDBBackend from 'absurd-sql/dist/indexeddb-backend'; | 
				
			|||
 | 
				
			|||
async function setupDatabase() { | 
				
			|||
  let SQL = await initSqlJs({ locateFile: file => file }); | 
				
			|||
  let sqlFS = new SQLiteFS(SQL.FS, new IndexedDBBackend()); | 
				
			|||
  SQL.register_for_idb(sqlFS); | 
				
			|||
   | 
				
			|||
  SQL.FS.mkdir('/sql'); | 
				
			|||
  SQL.FS.mount(sqlFS, {}, '/sql'); | 
				
			|||
   | 
				
			|||
  return new SQL.Database('/sql/db.sqlite', { filename: true }); | 
				
			|||
} | 
				
			|||
``` | 
				
			|||
 | 
				
			|||
## Troubleshooting | 
				
			|||
 | 
				
			|||
### Common Issues | 
				
			|||
1. SharedArrayBuffer not available | 
				
			|||
   - Check COOP/COEP headers | 
				
			|||
   - Verify browser support | 
				
			|||
   - Test fallback mode | 
				
			|||
 | 
				
			|||
2. Worker initialization failures | 
				
			|||
   - Check file paths | 
				
			|||
   - Verify module imports | 
				
			|||
   - Check browser console for errors | 
				
			|||
 | 
				
			|||
3. Performance issues | 
				
			|||
   - Monitor IndexedDB usage | 
				
			|||
   - Check for unnecessary operations | 
				
			|||
   - Verify transaction usage | 
				
			|||
 | 
				
			|||
## Resources | 
				
			|||
- [Project Demo](https://priceless-keller-d097e5.netlify.app/) | 
				
			|||
- [Example Project](https://github.com/jlongster/absurd-example-project) | 
				
			|||
- [Blog Post](https://jlongster.com/future-sql-web) | 
				
			|||
- [SQL.js Documentation](https://github.com/sql-js/sql.js/)  | 
				
			|||
					Loading…
					
					
				
		Reference in new issue