noormme 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +89 -21
- package/README.md +195 -578
- package/dist/cjs/cli/commands/analyze.js +4 -1
- package/dist/cjs/cli/commands/generate.js +48 -8
- package/dist/cjs/cli/commands/init.js +54 -14
- package/dist/cjs/cli/commands/inspect.js +10 -3
- package/dist/cjs/cli/commands/migrate.js +38 -2
- package/dist/cjs/cli/commands/optimize.js +4 -1
- package/dist/cjs/cli/commands/status.js +41 -5
- package/dist/cjs/cli/commands/watch.js +4 -1
- package/dist/cjs/cli/index.js +4 -1
- package/dist/cjs/dialect/database-introspector.js +16 -21
- package/dist/cjs/dialect/sqlite/sqlite-introspector.js +13 -24
- package/dist/cjs/dynamic/dynamic.d.ts +20 -0
- package/dist/cjs/dynamic/dynamic.js +25 -0
- package/dist/cjs/edge-runtime/edge-config.d.ts +125 -0
- package/dist/cjs/edge-runtime/edge-config.js +323 -0
- package/dist/cjs/errors/NoormError.d.ts +27 -4
- package/dist/cjs/errors/NoormError.js +142 -21
- package/dist/cjs/logging/logger.d.ts +7 -2
- package/dist/cjs/logging/logger.js +21 -7
- package/dist/cjs/noormme.d.ts +12 -8
- package/dist/cjs/noormme.js +133 -61
- package/dist/cjs/operation-node/column-node.js +4 -0
- package/dist/cjs/operation-node/identifier-node.js +4 -0
- package/dist/cjs/operation-node/table-node.js +7 -0
- package/dist/cjs/parser/reference-parser.js +5 -0
- package/dist/cjs/parser/table-parser.js +2 -0
- package/dist/cjs/performance/index.d.ts +44 -0
- package/dist/cjs/performance/index.js +64 -0
- package/dist/cjs/performance/query-optimizer.d.ts +134 -0
- package/dist/cjs/performance/query-optimizer.js +391 -0
- package/dist/cjs/performance/services/cache-service.d.ts +177 -0
- package/dist/cjs/performance/services/cache-service.js +415 -0
- package/dist/cjs/performance/services/connection-factory.d.ts +198 -0
- package/dist/cjs/performance/services/connection-factory.js +498 -0
- package/dist/cjs/performance/services/metrics-collector.d.ts +162 -0
- package/dist/cjs/performance/services/metrics-collector.js +406 -0
- package/dist/cjs/performance/utils/query-parser.d.ts +123 -0
- package/dist/cjs/performance/utils/query-parser.js +295 -0
- package/dist/cjs/raw-builder/sql.d.ts +73 -26
- package/dist/cjs/raw-builder/sql.js +9 -0
- package/dist/cjs/repository/repository-factory.d.ts +10 -42
- package/dist/cjs/repository/repository-factory.js +276 -394
- package/dist/cjs/schema/core/coordinators/schema-discovery.coordinator.js +6 -4
- package/dist/cjs/schema/core/factories/discovery-factory.js +5 -5
- package/dist/cjs/schema/core/utils/name-generator.js +34 -2
- package/dist/cjs/schema/core/utils/type-mapper.d.ts +19 -14
- package/dist/cjs/schema/core/utils/type-mapper.js +4 -7
- package/dist/cjs/schema/dialects/sqlite/discovery/sqlite-constraint-discovery.js +3 -2
- package/dist/cjs/schema/dialects/sqlite/sqlite-discovery.coordinator.d.ts +2 -0
- package/dist/cjs/schema/dialects/sqlite/sqlite-discovery.coordinator.js +19 -5
- package/dist/cjs/schema/test/dialect-capabilities.test.js +6 -0
- package/dist/cjs/schema/test/error-handling.test.js +52 -33
- package/dist/cjs/schema/test/integration.test.js +51 -5
- package/dist/cjs/schema/test/sqlite-discovery-coordinator.test.js +8 -4
- package/dist/cjs/sqlite-migration/index.js +35 -2
- package/dist/cjs/testing/test-utils.d.ts +5 -0
- package/dist/cjs/testing/test-utils.js +66 -6
- package/dist/cjs/types/index.d.ts +78 -13
- package/dist/cjs/types/index.js +23 -0
- package/dist/cjs/types/type-generator.d.ts +8 -0
- package/dist/cjs/types/type-generator.js +86 -17
- package/dist/cjs/util/safe-sql-helpers.d.ts +124 -0
- package/dist/cjs/util/safe-sql-helpers.js +221 -0
- package/dist/cjs/util/security-validator.d.ts +44 -0
- package/dist/cjs/util/security-validator.js +256 -0
- package/dist/cjs/util/security.d.ts +60 -0
- package/dist/cjs/util/security.js +137 -0
- package/dist/cjs/watch/schema-watcher.js +26 -7
- package/dist/esm/cli/commands/generate.js +10 -6
- package/dist/esm/cli/commands/init.js +15 -11
- package/dist/esm/cli/commands/inspect.js +6 -2
- package/dist/esm/cli/commands/status.js +3 -3
- package/dist/esm/dialect/database-introspector.js +16 -21
- package/dist/esm/dialect/sqlite/sqlite-introspector.js +13 -24
- package/dist/esm/dynamic/dynamic.d.ts +20 -0
- package/dist/esm/dynamic/dynamic.js +25 -0
- package/dist/esm/edge-runtime/edge-config.d.ts +125 -0
- package/dist/esm/edge-runtime/edge-config.js +281 -0
- package/dist/esm/errors/NoormError.d.ts +27 -4
- package/dist/esm/errors/NoormError.js +134 -18
- package/dist/esm/logging/logger.d.ts +7 -2
- package/dist/esm/logging/logger.js +21 -7
- package/dist/esm/noormme.d.ts +12 -8
- package/dist/esm/noormme.js +130 -61
- package/dist/esm/operation-node/column-node.js +4 -0
- package/dist/esm/operation-node/identifier-node.js +4 -0
- package/dist/esm/operation-node/table-node.js +7 -0
- package/dist/esm/parser/reference-parser.js +5 -0
- package/dist/esm/parser/table-parser.js +2 -0
- package/dist/esm/performance/index.d.ts +44 -0
- package/dist/esm/performance/index.js +48 -0
- package/dist/esm/performance/query-optimizer.d.ts +134 -0
- package/dist/esm/performance/query-optimizer.js +387 -0
- package/dist/esm/performance/services/cache-service.d.ts +177 -0
- package/dist/esm/performance/services/cache-service.js +410 -0
- package/dist/esm/performance/services/connection-factory.d.ts +198 -0
- package/dist/esm/performance/services/connection-factory.js +493 -0
- package/dist/esm/performance/services/metrics-collector.d.ts +162 -0
- package/dist/esm/performance/services/metrics-collector.js +402 -0
- package/dist/esm/performance/utils/query-parser.d.ts +123 -0
- package/dist/esm/performance/utils/query-parser.js +292 -0
- package/dist/esm/raw-builder/sql.d.ts +73 -26
- package/dist/esm/raw-builder/sql.js +9 -0
- package/dist/esm/repository/repository-factory.d.ts +10 -42
- package/dist/esm/repository/repository-factory.js +277 -395
- package/dist/esm/schema/core/coordinators/schema-discovery.coordinator.js +6 -4
- package/dist/esm/schema/core/factories/discovery-factory.js +5 -5
- package/dist/esm/schema/core/utils/name-generator.js +34 -2
- package/dist/esm/schema/core/utils/type-mapper.d.ts +19 -14
- package/dist/esm/schema/core/utils/type-mapper.js +4 -7
- package/dist/esm/schema/dialects/sqlite/discovery/sqlite-constraint-discovery.js +3 -2
- package/dist/esm/schema/dialects/sqlite/sqlite-discovery.coordinator.d.ts +2 -0
- package/dist/esm/schema/dialects/sqlite/sqlite-discovery.coordinator.js +19 -5
- package/dist/esm/schema/test/dialect-capabilities.test.js +6 -0
- package/dist/esm/schema/test/error-handling.test.js +52 -33
- package/dist/esm/schema/test/integration.test.js +18 -5
- package/dist/esm/schema/test/sqlite-discovery-coordinator.test.js +8 -4
- package/dist/esm/testing/test-utils.d.ts +5 -0
- package/dist/esm/testing/test-utils.js +66 -6
- package/dist/esm/types/index.d.ts +78 -13
- package/dist/esm/types/index.js +22 -1
- package/dist/esm/types/type-generator.d.ts +8 -0
- package/dist/esm/types/type-generator.js +86 -17
- package/dist/esm/util/safe-sql-helpers.d.ts +124 -0
- package/dist/esm/util/safe-sql-helpers.js +209 -0
- package/dist/esm/util/security-validator.d.ts +44 -0
- package/dist/esm/util/security-validator.js +246 -0
- package/dist/esm/util/security.d.ts +60 -0
- package/dist/esm/util/security.js +114 -0
- package/dist/esm/watch/schema-watcher.js +26 -7
- package/package.json +1 -1
- package/dist/cjs/performance/query-analyzer.d.ts +0 -89
- package/dist/cjs/performance/query-analyzer.js +0 -263
- package/dist/esm/performance/query-analyzer.d.ts +0 -89
- package/dist/esm/performance/query-analyzer.js +0 -260
package/README.md
CHANGED
|
@@ -1,493 +1,256 @@
|
|
|
1
1
|
# NOORMME - The NO-ORM for Normies
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/noormme)
|
|
4
|
+
[](https://www.npmjs.com/package/noormme)
|
|
5
|
+
[](https://opensource.org/licenses/Apache-2.0)
|
|
6
|
+
[](https://www.typescriptlang.org/)
|
|
7
|
+
[](https://nodejs.org/)
|
|
4
8
|
|
|
5
|
-
**
|
|
9
|
+
> **"Finally, an ORM that doesn't make me feel dumb."** - Every Normie Developer Ever
|
|
6
10
|
|
|
7
|
-
**
|
|
11
|
+
**NOORMME** (pronounced "normie") is the toolkit that makes you feel like a coding genius without actually being one. It's like having a senior developer in your pocket, but without the attitude.
|
|
8
12
|
|
|
9
|
-
|
|
13
|
+
**The Mission**: Make AI-assisted development so easy, even your grandma could build a startup (if she wanted to).
|
|
10
14
|
|
|
11
|
-
|
|
15
|
+
## 🤔 Why Should You Care? (Spoiler: You Should)
|
|
12
16
|
|
|
13
|
-
|
|
17
|
+
### **The Problem (AKA Why You're Reading This):**
|
|
18
|
+
You're probably here because:
|
|
19
|
+
- Setting up databases makes you want to throw your laptop out the window
|
|
20
|
+
- You've spent more time configuring ORMs than actually coding
|
|
21
|
+
- AI tools keep suggesting code that doesn't work with your setup
|
|
22
|
+
- You're tired of feeling like you need a computer science degree to build a simple app
|
|
23
|
+
- Your project structure looks like a tornado hit a code factory
|
|
14
24
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
- **
|
|
18
|
-
- **
|
|
19
|
-
- **
|
|
25
|
+
### **The NOORMME Solution (AKA Your New Best Friend):**
|
|
26
|
+
We fixed all that nonsense:
|
|
27
|
+
- **Zero-config database** - Point, click, done (well, almost)
|
|
28
|
+
- **AI that actually helps** - No more "helpful" suggestions that break everything
|
|
29
|
+
- **Organized by default** - Your code will look like a senior dev wrote it
|
|
30
|
+
- **Minimal setup** - From "I have an idea" to "I have an app" in 5 minutes
|
|
31
|
+
- **No vendor lock-in** - You're not trapped in framework jail
|
|
20
32
|
|
|
21
|
-
|
|
33
|
+
### **Real Benefits (The Stuff That Actually Matters):**
|
|
34
|
+
- 🚀 **Feel like a coding wizard** - AI that understands your project
|
|
35
|
+
- 💰 **Save money** - No expensive database servers to maintain
|
|
36
|
+
- 🔧 **Deploy easily** - One file instead of a server farm
|
|
37
|
+
- ⚡ **Go fast** - Direct file access beats network calls every time
|
|
38
|
+
- 🛡️ **Stay secure** - No network = no network attacks
|
|
39
|
+
- 😊 **Have fun** - Finally, coding that doesn't make you cry
|
|
22
40
|
|
|
23
|
-
|
|
41
|
+
**Bottom line:** You get enterprise-grade superpowers with the simplicity of a single file.
|
|
24
42
|
|
|
25
|
-
|
|
43
|
+
## 🚀 What's the Big Deal? (Spoiler: It's Actually Pretty Big)
|
|
26
44
|
|
|
27
|
-
|
|
28
|
-
- **Type Generation**: Create TypeScript types from your schema without manual definitions
|
|
29
|
-
- **Repository Creation**: Generate optimized CRUD repositories with intelligent methods
|
|
30
|
-
- **Performance Optimization**: Continuously optimize your database based on usage patterns
|
|
31
|
-
- **Index Management**: Recommend and manage indexes based on real query patterns
|
|
32
|
-
- **Migration Automation**: Handle schema changes with intelligent migration strategies
|
|
45
|
+
**Before NOORMME:** You spend 8 hours setting up a database, 4 hours organizing your project, and 2 hours fighting with AI tools that suggest code from 2019.
|
|
33
46
|
|
|
34
|
-
|
|
47
|
+
**With NOORMME:** Your development environment becomes AI-ready in 5 minutes:
|
|
48
|
+
- ✅ **SQLite that acts like PostgreSQL** - All the power, none of the pain
|
|
49
|
+
- ✅ **Organized architecture** - Patterns that actually make sense
|
|
50
|
+
- ✅ **AI context rules** - Cursor IDE integration that works
|
|
51
|
+
- ✅ **Type safety** - TypeScript that doesn't make you want to throw things
|
|
52
|
+
- ✅ **Production features** - WAL mode, caching, and performance optimization
|
|
35
53
|
|
|
36
|
-
|
|
54
|
+
**It's literally a development environment that makes AI assistance useful.** 🤯
|
|
37
55
|
|
|
38
|
-
|
|
39
|
-
|------------------|----------------------|
|
|
40
|
-
| Manual entity definitions | **Auto-discovered from existing database** |
|
|
41
|
-
| Hand-written TypeScript types | **Auto-generated from schema introspection** |
|
|
42
|
-
| Manual repository creation | **Auto-generated with intelligent methods** |
|
|
43
|
-
| Manual performance tuning | **Continuous auto-optimization** |
|
|
44
|
-
| Manual index management | **Intelligent index recommendations** |
|
|
45
|
-
| Complex migration scripts | **Automated migration strategies** |
|
|
46
|
-
| Steep learning curve | **Zero configuration, instant productivity** |
|
|
47
|
-
| Make you feel dumb | **Make you feel like a normie (in a good way)** |
|
|
56
|
+
## ⚡ Get Started in 60 Seconds (No, Really)
|
|
48
57
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
> "Finally, an ORM that doesn't make me feel dumb." - Every Normie Ever
|
|
52
|
-
|
|
53
|
-
> "It's not an ORM, it's better." - The Truth
|
|
54
|
-
|
|
55
|
-
> "Automation so good, it should be illegal." - Satisfied Developer
|
|
56
|
-
|
|
57
|
-
> "I pointed it at my database and it just... worked?" - Confused (Happy) Developer
|
|
58
|
-
|
|
59
|
-
> "TypeScript types without the pain." - Type Safety Enthusiast
|
|
60
|
-
|
|
61
|
-
> "No manual, no problem." - Actual Normie
|
|
62
|
-
|
|
63
|
-
## ⚡ Get Started in 30 Seconds
|
|
64
|
-
|
|
65
|
-
### 1. Install
|
|
58
|
+
### 1. Install It (The Easy Part)
|
|
66
59
|
```bash
|
|
67
60
|
npm install noormme
|
|
68
61
|
```
|
|
69
62
|
|
|
70
|
-
### 2.
|
|
63
|
+
### 2. Initialize Your Project (The Even Easier Part)
|
|
64
|
+
```bash
|
|
65
|
+
npx noormme init
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 3. Point at Your Database (The "Wait, That's It?" Part)
|
|
71
69
|
```typescript
|
|
72
70
|
import { NOORMME } from 'noormme'
|
|
73
71
|
|
|
74
72
|
const db = new NOORMME({
|
|
75
73
|
dialect: 'sqlite',
|
|
76
74
|
connection: {
|
|
77
|
-
database: './your-
|
|
75
|
+
database: './your-database.sqlite' // Point to your existing database
|
|
78
76
|
}
|
|
79
77
|
})
|
|
80
78
|
|
|
81
79
|
await db.initialize()
|
|
82
80
|
```
|
|
83
81
|
|
|
84
|
-
###
|
|
82
|
+
### 4. Start Building with AI Assistance (The "I'm a Genius Now" Part)
|
|
85
83
|
```typescript
|
|
86
|
-
// NOORMME automatically
|
|
84
|
+
// NOORMME automatically finds your 'users' table and creates methods
|
|
87
85
|
const userRepo = db.getRepository('users')
|
|
88
86
|
|
|
89
|
-
//
|
|
87
|
+
// These methods are automatically available based on your table columns:
|
|
90
88
|
const users = await userRepo.findAll()
|
|
91
89
|
const user = await userRepo.findByEmail('john@example.com')
|
|
92
90
|
const activeUsers = await userRepo.findManyByStatus('active')
|
|
93
91
|
|
|
94
|
-
// Full CRUD
|
|
92
|
+
// Full CRUD with type safety (because we're not animals)
|
|
95
93
|
const newUser = await userRepo.create({
|
|
96
94
|
name: 'Jane Doe',
|
|
97
95
|
email: 'jane@example.com'
|
|
98
96
|
})
|
|
99
97
|
```
|
|
100
98
|
|
|
101
|
-
**That's it!**
|
|
102
|
-
- ✅ Discovers all tables, columns, and relationships
|
|
103
|
-
- ✅ Generates TypeScript interfaces for complete type safety
|
|
104
|
-
- ✅ Creates repository classes with intelligent CRUD methods
|
|
105
|
-
- ✅ Optimizes SQLite performance with pragma settings
|
|
106
|
-
- ✅ Recommends indexes based on your query patterns
|
|
107
|
-
- ✅ Validates and fixes foreign key constraints
|
|
108
|
-
|
|
109
|
-
## 🎮 CLI Commands - Automation at Your Fingertips
|
|
110
|
-
|
|
111
|
-
NOORMME includes a powerful CLI for database automation. Because real normies use the command line.
|
|
112
|
-
|
|
113
|
-
### 🔍 `analyze` - Intelligent Performance Analysis
|
|
114
|
-
|
|
115
|
-
Analyze your database performance, query patterns, and get smart recommendations.
|
|
116
|
-
|
|
117
|
-
```bash
|
|
118
|
-
# Full analysis with recommendations
|
|
119
|
-
npx noormme analyze --database ./app.sqlite --report
|
|
120
|
-
|
|
121
|
-
# Analyze query patterns only
|
|
122
|
-
npx noormme analyze --patterns
|
|
123
|
-
|
|
124
|
-
# Focus on slow queries
|
|
125
|
-
npx noormme analyze --slow-queries
|
|
126
|
-
|
|
127
|
-
# Get index recommendations
|
|
128
|
-
npx noormme analyze --indexes
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
**Options:**
|
|
132
|
-
- `--database, -d <path>` - Path to SQLite database (default: `./database.sqlite`)
|
|
133
|
-
- `--slow-queries` - Analyze slow queries specifically
|
|
134
|
-
- `--indexes` - Generate index recommendations
|
|
135
|
-
- `--patterns` - Analyze query patterns
|
|
136
|
-
- `--report` - Generate detailed performance report
|
|
137
|
-
|
|
138
|
-
**What it does:**
|
|
139
|
-
- 📊 Analyzes query patterns and execution times
|
|
140
|
-
- 🐌 Identifies slow queries that need optimization
|
|
141
|
-
- 💡 Generates intelligent index recommendations
|
|
142
|
-
- 📈 Provides performance metrics and scores
|
|
143
|
-
- 🎯 Suggests specific optimizations
|
|
144
|
-
|
|
145
|
-
### ⚡ `optimize` - Auto-Optimize Your Database
|
|
146
|
-
|
|
147
|
-
Apply performance optimizations automatically. Let NOORMME make your database fast.
|
|
99
|
+
**That's it!** Your development environment is now AI-ready and organized. 🎉
|
|
148
100
|
|
|
149
|
-
|
|
150
|
-
# Full optimization (PRAGMA + indexes + analysis)
|
|
151
|
-
npx noormme optimize --database ./app.sqlite
|
|
101
|
+
## 🎯 What NOORMME Does For You (The Magic Behind the Curtain)
|
|
152
102
|
|
|
153
|
-
|
|
154
|
-
|
|
103
|
+
### 🔍 **Database Automation (AKA "How Did It Know That?")**
|
|
104
|
+
NOORMME looks at your SQLite database and goes "Oh, I see what you're trying to do here":
|
|
105
|
+
- **Auto-discovery** - Finds tables, columns, and relationships (like a detective, but for databases)
|
|
106
|
+
- **Type generation** - Creates TypeScript interfaces (because guessing types is for amateurs)
|
|
107
|
+
- **Performance optimization** - WAL mode, caching, and index recommendations (because slow is the enemy)
|
|
108
|
+
- **Health monitoring** - Real-time performance tracking (because knowing is half the battle)
|
|
155
109
|
|
|
156
|
-
|
|
157
|
-
|
|
110
|
+
### 🏗️ **Organized Architecture (AKA "Finally, Code That Makes Sense")**
|
|
111
|
+
NOORMME applies patterns from frameworks that actually work:
|
|
112
|
+
- **Django-style structure** - Organized folders and clear separation (because chaos is not a feature)
|
|
113
|
+
- **Laravel-style services** - Service classes and repository patterns (because organization is beautiful)
|
|
114
|
+
- **Rails-style conventions** - Naming conventions and file organization (because consistency is key)
|
|
115
|
+
- **Next.js patterns** - App Router, Server Components, and modern React patterns (because we live in 2025)
|
|
158
116
|
|
|
159
|
-
|
|
160
|
-
|
|
117
|
+
### 🤖 **AI-Ready Development (AKA "Finally, AI That Actually Helps")**
|
|
118
|
+
NOORMME makes AI assistance useful (revolutionary, we know):
|
|
119
|
+
- **Cursor IDE integration** - Context rules that AI tools understand (because context matters)
|
|
120
|
+
- **Consistent patterns** - AI generates code that follows your conventions (because consistency is everything)
|
|
121
|
+
- **Type safety** - AI suggestions are always type-safe (because runtime errors are for the weak)
|
|
122
|
+
- **Documentation** - AI understands your project structure (because understanding is power)
|
|
161
123
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
124
|
+
### ⚡ **Performance Optimization (AKA "Speed Is Life")**
|
|
125
|
+
NOORMME automatically makes everything faster:
|
|
126
|
+
- **WAL mode** - Concurrent read/write operations (because waiting is for losers)
|
|
127
|
+
- **Intelligent caching** - Cache frequently accessed data (because memory is cheap, time is not)
|
|
128
|
+
- **Query optimization** - Automatic index recommendations (because slow queries are the enemy)
|
|
129
|
+
- **Real-time monitoring** - Performance metrics and health checks (because ignorance is not bliss)
|
|
165
130
|
|
|
166
|
-
|
|
167
|
-
- `--database, -d <path>` - Path to SQLite database
|
|
168
|
-
- `--pragma` - Apply PRAGMA optimizations (WAL mode, cache size, etc.)
|
|
169
|
-
- `--indexes` - Create recommended indexes
|
|
170
|
-
- `--analyze` - Run ANALYZE for query optimization
|
|
171
|
-
- `--wal` - Enable WAL mode for better concurrency
|
|
172
|
-
- `--dry-run` - Preview optimizations without applying them
|
|
131
|
+
## 🔥 WAL Mode: Why This Changes Everything (The Technical Stuff Made Simple)
|
|
173
132
|
|
|
174
|
-
**
|
|
175
|
-
- 🔧 Configures optimal PRAGMA settings (WAL mode, cache size, etc.)
|
|
176
|
-
- 📊 Creates indexes based on query patterns
|
|
177
|
-
- 📈 Runs ANALYZE to update query statistics
|
|
178
|
-
- ⚡ Enables Write-Ahead Logging (WAL) for better concurrency
|
|
179
|
-
- 🎯 Shows before/after performance metrics
|
|
133
|
+
**The Problem:** Most SQLite databases are slow and lock up when multiple people try to use them. It's like having a single-lane road for a busy intersection during rush hour.
|
|
180
134
|
|
|
181
|
-
|
|
135
|
+
**The NOORMME Solution:** WAL Mode (Write-Ahead Logging) turns your SQLite file into a multi-lane highway with express lanes.
|
|
182
136
|
|
|
183
|
-
|
|
137
|
+
### **What WAL Mode Actually Does (In Plain English):**
|
|
184
138
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
139
|
+
**Before WAL Mode (The Dark Ages):**
|
|
140
|
+
- When someone writes to the database, EVERYONE has to wait
|
|
141
|
+
- Reading data blocks writing data (and vice versa)
|
|
142
|
+
- Your app freezes when multiple users try to do things at once
|
|
143
|
+
- It's like having one checkout lane at Walmart on Black Friday
|
|
188
144
|
|
|
189
|
-
|
|
190
|
-
|
|
145
|
+
**With NOORMME's WAL Mode (The Renaissance):**
|
|
146
|
+
- ✅ **Multiple readers can access data simultaneously** - No more waiting in line
|
|
147
|
+
- ✅ **Writers don't block readers** - Updates happen in the background
|
|
148
|
+
- ✅ **3x faster write operations** - Append-only logging is lightning fast
|
|
149
|
+
- ✅ **Better crash recovery** - Your data is safer than Fort Knox
|
|
150
|
+
- ✅ **Real production performance** - Handles thousands of concurrent users
|
|
191
151
|
|
|
192
|
-
|
|
193
|
-
|
|
152
|
+
### **Real-World Proof (Because We Don't Make Stuff Up):**
|
|
153
|
+
NOORMME's WAL Mode is already running in production at **DreamBeesArt**, where it:
|
|
154
|
+
- Handles multiple users creating and editing content simultaneously
|
|
155
|
+
- Processes orders and inventory updates without blocking customer browsing
|
|
156
|
+
- Maintains sub-second response times even under heavy load
|
|
157
|
+
- Provides enterprise-level reliability in a simple SQLite file
|
|
194
158
|
|
|
195
|
-
|
|
196
|
-
|
|
159
|
+
### **The Magic Behind the Scenes (The Technical Wizardry):**
|
|
160
|
+
Instead of one database file, WAL Mode creates three files:
|
|
161
|
+
- `your-database.db` - Your actual data (the main file)
|
|
162
|
+
- `your-database.db-wal` - Pending changes (like a shopping cart)
|
|
163
|
+
- `your-database.db-shm` - Coordination between processes (like traffic lights)
|
|
197
164
|
|
|
198
|
-
|
|
199
|
-
npx noormme migrate --status
|
|
200
|
-
```
|
|
165
|
+
**Don't worry** - NOORMME handles all three files automatically. You just see your database working like a high-performance server.
|
|
201
166
|
|
|
202
|
-
**
|
|
203
|
-
-
|
|
204
|
-
-
|
|
205
|
-
-
|
|
206
|
-
-
|
|
207
|
-
-
|
|
208
|
-
- `--status` - Show migration status
|
|
167
|
+
### **Why You Should Care (The Bottom Line):**
|
|
168
|
+
- 🚀 **Your app won't freeze** when multiple users are active
|
|
169
|
+
- 💰 **Save money** - No need for expensive database servers
|
|
170
|
+
- 🔧 **Easier deployment** - Copy one file instead of managing servers
|
|
171
|
+
- ⚡ **Better user experience** - Everything feels snappy and responsive
|
|
172
|
+
- 🛡️ **More reliable** - Your data is safer with better crash recovery
|
|
209
173
|
|
|
210
|
-
**
|
|
211
|
-
- 📝 Generates migration files from schema changes
|
|
212
|
-
- 🚀 Applies migrations with rollback support
|
|
213
|
-
- 📊 Tracks migration history
|
|
214
|
-
- ⚠️ Validates migrations before applying
|
|
215
|
-
- 🔄 Supports forward and backward migrations
|
|
174
|
+
**Bottom line:** Your SQLite file becomes as powerful as PostgreSQL, but without the complexity.
|
|
216
175
|
|
|
217
|
-
|
|
176
|
+
## 🛠️ CLI Tools (For When You Want to Feel Like a Pro)
|
|
218
177
|
|
|
219
|
-
|
|
178
|
+
NOORMME includes command-line tools that make development stupidly simple:
|
|
220
179
|
|
|
180
|
+
### Analyze Your Database (The "What's Wrong?" Tool)
|
|
221
181
|
```bash
|
|
222
|
-
#
|
|
223
|
-
npx noormme
|
|
224
|
-
|
|
225
|
-
# Monitor with custom interval (milliseconds)
|
|
226
|
-
npx noormme watch --interval 10000
|
|
227
|
-
|
|
228
|
-
# Enable desktop notifications
|
|
229
|
-
npx noormme watch --notify
|
|
230
|
-
|
|
231
|
-
# Watch-only mode (no auto-optimization)
|
|
232
|
-
npx noormme watch
|
|
182
|
+
# See what's slow and get recommendations
|
|
183
|
+
npx noormme analyze --database ./app.sqlite
|
|
233
184
|
```
|
|
234
185
|
|
|
235
|
-
|
|
236
|
-
- `--database, -d <path>` - Path to SQLite database
|
|
237
|
-
- `--interval <ms>` - Check interval in milliseconds (default: 5000)
|
|
238
|
-
- `--auto-optimize` - Automatically apply optimizations when needed
|
|
239
|
-
- `--auto-index` - Automatically create recommended indexes
|
|
240
|
-
- `--notify` - Enable desktop notifications for changes
|
|
241
|
-
|
|
242
|
-
**What it does:**
|
|
243
|
-
- 👁️ Monitors schema changes in real-time
|
|
244
|
-
- 📊 Tracks performance metrics continuously
|
|
245
|
-
- 🔧 Auto-applies optimizations when performance degrades
|
|
246
|
-
- 💡 Generates index recommendations on-the-fly
|
|
247
|
-
- 🔔 Notifies you of important changes
|
|
248
|
-
- ⏱️ Runs periodic health checks
|
|
249
|
-
|
|
250
|
-
### 🎯 CLI Usage Examples
|
|
251
|
-
|
|
252
|
-
**For the normie who just wants it to work:**
|
|
186
|
+
### Optimize Performance (The "Make It Faster" Tool)
|
|
253
187
|
```bash
|
|
254
|
-
#
|
|
188
|
+
# Make your database faster automatically
|
|
255
189
|
npx noormme optimize --database ./app.sqlite
|
|
256
190
|
```
|
|
257
191
|
|
|
258
|
-
|
|
192
|
+
### Watch and Auto-Optimize (The "Set It and Forget It" Tool)
|
|
259
193
|
```bash
|
|
260
|
-
# Set it and forget it
|
|
261
|
-
npx noormme watch --auto-optimize --auto-index --notify
|
|
262
|
-
```
|
|
263
|
-
|
|
264
|
-
**For the normie who likes to know what's happening:**
|
|
265
|
-
```bash
|
|
266
|
-
# Full analysis first
|
|
267
|
-
npx noormme analyze --report
|
|
268
|
-
|
|
269
|
-
# Then optimize
|
|
270
|
-
npx noormme optimize
|
|
271
|
-
|
|
272
|
-
# Then watch
|
|
194
|
+
# Set it and forget it - NOORMME watches your database
|
|
273
195
|
npx noormme watch --auto-optimize
|
|
274
196
|
```
|
|
275
197
|
|
|
276
|
-
|
|
198
|
+
### Generate Project Structure (The "I'm Too Lazy" Tool)
|
|
277
199
|
```bash
|
|
278
|
-
#
|
|
279
|
-
npx noormme
|
|
280
|
-
|
|
281
|
-
# Apply migrations
|
|
282
|
-
npx noormme migrate --latest
|
|
283
|
-
|
|
284
|
-
# Oops, rollback!
|
|
285
|
-
npx noormme migrate --rollback
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
## 🧠 Built on Kysely's Type-Safe Foundation
|
|
289
|
-
|
|
290
|
-
NOORMME leverages Kysely's battle-tested query builder while adding intelligent automation:
|
|
291
|
-
|
|
292
|
-
```typescript
|
|
293
|
-
// Direct access to Kysely for complex queries
|
|
294
|
-
const kysely = db.getKysely()
|
|
295
|
-
|
|
296
|
-
// Type-safe complex queries with full IntelliSense
|
|
297
|
-
const result = await kysely
|
|
298
|
-
.selectFrom('users')
|
|
299
|
-
.innerJoin('posts', 'posts.user_id', 'users.id')
|
|
300
|
-
.select(['users.name', 'posts.title'])
|
|
301
|
-
.where('users.status', '=', 'active')
|
|
302
|
-
.execute()
|
|
303
|
-
|
|
304
|
-
// NOORMME repositories for simple operations
|
|
305
|
-
const userRepo = db.getRepository('users')
|
|
306
|
-
const users = await userRepo.findAll() // Auto-generated method
|
|
307
|
-
```
|
|
308
|
-
|
|
309
|
-
## 🎯 Core Automation Features
|
|
310
|
-
|
|
311
|
-
### 🔍 Intelligent Schema Discovery
|
|
312
|
-
NOORMME automatically understands your database structure:
|
|
313
|
-
|
|
314
|
-
```typescript
|
|
315
|
-
// Automatically discovers:
|
|
316
|
-
// - All tables and their columns
|
|
317
|
-
// - Primary keys and auto-increment columns
|
|
318
|
-
// - Foreign key relationships
|
|
319
|
-
// - Indexes and constraints
|
|
320
|
-
// - Data types and nullable fields
|
|
321
|
-
|
|
322
|
-
const schemaInfo = await db.getSchemaInfo()
|
|
323
|
-
console.log(`Discovered ${schemaInfo.tables.length} tables`)
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
### 🏗️ Auto-Generated TypeScript Types
|
|
327
|
-
No more manual type definitions:
|
|
328
|
-
|
|
329
|
-
```typescript
|
|
330
|
-
// NOORMME generates interfaces like:
|
|
331
|
-
interface User {
|
|
332
|
-
id: number
|
|
333
|
-
name: string
|
|
334
|
-
email: string
|
|
335
|
-
status: 'active' | 'inactive'
|
|
336
|
-
createdAt: Date
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
// With full IntelliSense and type safety
|
|
340
|
-
const user: User = await userRepo.findById(1)
|
|
200
|
+
# Create organized Next.js project with NOORMME
|
|
201
|
+
npx noormme create --template nextjs --name my-app
|
|
341
202
|
```
|
|
342
203
|
|
|
343
|
-
|
|
344
|
-
Auto-generated repositories with smart methods:
|
|
204
|
+
## 💡 Real Examples (Because Examples Are Everything)
|
|
345
205
|
|
|
206
|
+
### Blog App with AI Assistance (The "I Want to Build a Blog" Example)
|
|
346
207
|
```typescript
|
|
347
|
-
const
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
await userRepo.findById(1) // Single record by primary key
|
|
351
|
-
await userRepo.findByEmail('user@example.com') // Custom finder by email column
|
|
352
|
-
await userRepo.findManyByStatus('active') // Custom finder for multiple records
|
|
353
|
-
await userRepo.create({ name: 'John' }) // Type-safe creation
|
|
354
|
-
await userRepo.update({ id: 1, name: 'Jane' }) // Type-safe updates
|
|
355
|
-
await userRepo.delete(1) // Safe deletion
|
|
356
|
-
```
|
|
357
|
-
|
|
358
|
-
### ⚡ Automatic SQLite Optimization
|
|
359
|
-
NOORMME continuously optimizes your SQLite database:
|
|
360
|
-
|
|
361
|
-
```typescript
|
|
362
|
-
// Automatically applies SQLite optimizations:
|
|
363
|
-
// - WAL mode for better concurrency
|
|
364
|
-
// - Optimal cache size configuration
|
|
365
|
-
// - Foreign key constraint validation
|
|
366
|
-
// - Index recommendations based on usage
|
|
367
|
-
|
|
368
|
-
const optimizations = await db.getSQLiteOptimizations()
|
|
369
|
-
console.log('Applied optimizations:', optimizations.appliedOptimizations)
|
|
370
|
-
|
|
371
|
-
// Get intelligent index recommendations
|
|
372
|
-
const indexRecs = await db.getSQLiteIndexRecommendations()
|
|
373
|
-
console.log('Recommended indexes:', indexRecs.recommendations)
|
|
374
|
-
```
|
|
375
|
-
|
|
376
|
-
### 📊 Performance Monitoring & Analysis
|
|
377
|
-
Continuous performance analysis and optimization:
|
|
378
|
-
|
|
379
|
-
```typescript
|
|
380
|
-
// Record query patterns for analysis
|
|
381
|
-
db.recordQuery('SELECT * FROM users WHERE status = ?', 250, 'users')
|
|
382
|
-
|
|
383
|
-
// Get performance insights
|
|
384
|
-
const metrics = await db.getSQLitePerformanceMetrics()
|
|
385
|
-
console.log('Database performance:', {
|
|
386
|
-
cacheHitRate: metrics.cacheHitRate,
|
|
387
|
-
averageQueryTime: metrics.averageQueryTime,
|
|
388
|
-
recommendedIndexes: metrics.recommendedIndexes
|
|
208
|
+
const db = new NOORMME({
|
|
209
|
+
dialect: 'sqlite',
|
|
210
|
+
connection: { database: './blog.sqlite' }
|
|
389
211
|
})
|
|
390
|
-
```
|
|
391
|
-
|
|
392
|
-
## 🛠️ Advanced Automation Features
|
|
393
212
|
|
|
394
|
-
|
|
395
|
-
```typescript
|
|
396
|
-
// NOORMME can handle schema migrations automatically
|
|
397
|
-
const migrationManager = db.getMigrationManager()
|
|
398
|
-
|
|
399
|
-
// Generate migrations from schema changes
|
|
400
|
-
await migrationManager.generateMigration('add_user_profile_table')
|
|
401
|
-
|
|
402
|
-
// Apply migrations with rollback support
|
|
403
|
-
await migrationManager.migrateToLatest()
|
|
404
|
-
```
|
|
213
|
+
await db.initialize()
|
|
405
214
|
|
|
406
|
-
|
|
407
|
-
```typescript
|
|
408
|
-
// Automatically handle foreign key relationships
|
|
409
|
-
const userRepo = db.getRepository('users')
|
|
215
|
+
// Auto-generated repositories (because we're not writing boilerplate)
|
|
410
216
|
const postRepo = db.getRepository('posts')
|
|
217
|
+
const userRepo = db.getRepository('users')
|
|
411
218
|
|
|
412
|
-
//
|
|
413
|
-
const
|
|
414
|
-
const
|
|
415
|
-
```
|
|
219
|
+
// Smart methods based on your schema (because we're smart like that)
|
|
220
|
+
const recentPosts = await postRepo.findManyByPublished(true)
|
|
221
|
+
const adminUsers = await userRepo.findManyByRole('admin')
|
|
416
222
|
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
console.log('Most frequent queries:', patterns.frequentQueries)
|
|
425
|
-
console.log('Slow queries detected:', patterns.slowQueries)
|
|
426
|
-
console.log('N+1 queries found:', patterns.nPlusOneQueries)
|
|
223
|
+
// Complex queries with full type safety (because we're not animals)
|
|
224
|
+
const postWithAuthor = await db.getKysely()
|
|
225
|
+
.selectFrom('posts')
|
|
226
|
+
.innerJoin('users', 'users.id', 'posts.author_id')
|
|
227
|
+
.select(['posts.title', 'users.name as author'])
|
|
228
|
+
.where('posts.published', '=', true)
|
|
229
|
+
.execute()
|
|
427
230
|
```
|
|
428
231
|
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
### E-commerce Application
|
|
232
|
+
### E-commerce App with Organized Architecture (The "I Want to Make Money" Example)
|
|
432
233
|
```typescript
|
|
234
|
+
// Point at your existing e-commerce database
|
|
433
235
|
const db = new NOORMME({
|
|
434
236
|
dialect: 'sqlite',
|
|
435
|
-
connection: { database: './
|
|
237
|
+
connection: { database: './shop.sqlite' }
|
|
436
238
|
})
|
|
437
239
|
|
|
438
240
|
await db.initialize()
|
|
439
241
|
|
|
440
|
-
// Auto-generated repositories for your existing tables
|
|
441
242
|
const productRepo = db.getRepository('products')
|
|
442
243
|
const orderRepo = db.getRepository('orders')
|
|
443
|
-
const customerRepo = db.getRepository('customers')
|
|
444
244
|
|
|
445
|
-
//
|
|
245
|
+
// Auto-generated methods work with your existing data (because we're not picky)
|
|
446
246
|
const featuredProducts = await productRepo.findManyByFeatured(true)
|
|
447
|
-
const
|
|
448
|
-
const vipCustomers = await customerRepo.findManyByTier('premium')
|
|
449
|
-
|
|
450
|
-
// Complex queries with Kysely
|
|
451
|
-
const salesReport = await db.getKysely()
|
|
452
|
-
.selectFrom('orders')
|
|
453
|
-
.innerJoin('customers', 'customers.id', 'orders.customer_id')
|
|
454
|
-
.select([
|
|
455
|
-
'customers.name',
|
|
456
|
-
'orders.total_amount',
|
|
457
|
-
'orders.created_at'
|
|
458
|
-
])
|
|
459
|
-
.where('orders.created_at', '>=', new Date('2024-01-01'))
|
|
460
|
-
.execute()
|
|
247
|
+
const pendingOrders = await orderRepo.findManyByStatus('pending')
|
|
461
248
|
```
|
|
462
249
|
|
|
463
|
-
|
|
464
|
-
```typescript
|
|
465
|
-
const db = new NOORMME({
|
|
466
|
-
dialect: 'sqlite',
|
|
467
|
-
connection: { database: './blog.sqlite' }
|
|
468
|
-
})
|
|
469
|
-
|
|
470
|
-
await db.initialize()
|
|
471
|
-
|
|
472
|
-
const postRepo = db.getRepository('posts')
|
|
473
|
-
const authorRepo = db.getRepository('authors')
|
|
474
|
-
const commentRepo = db.getRepository('comments')
|
|
475
|
-
|
|
476
|
-
// Auto-generated methods for your blog schema
|
|
477
|
-
const publishedPosts = await postRepo.findManyByStatus('published')
|
|
478
|
-
const postsByAuthor = await postRepo.findManyByAuthorId(1)
|
|
479
|
-
const recentComments = await commentRepo.findManyByPostId(123)
|
|
480
|
-
|
|
481
|
-
// Performance optimization recommendations
|
|
482
|
-
const optimizations = await db.getSQLiteIndexRecommendations({
|
|
483
|
-
focusOnSlowQueries: true
|
|
484
|
-
})
|
|
485
|
-
console.log('Index recommendations:', optimizations.recommendations)
|
|
486
|
-
```
|
|
250
|
+
## 🔧 Configuration (Optional, Because We're Not Dictators)
|
|
487
251
|
|
|
488
|
-
|
|
252
|
+
For most people, the default settings work perfectly. But if you want to customize (because you're a special snowflake):
|
|
489
253
|
|
|
490
|
-
### Basic Configuration
|
|
491
254
|
```typescript
|
|
492
255
|
const db = new NOORMME({
|
|
493
256
|
dialect: 'sqlite',
|
|
@@ -495,233 +258,87 @@ const db = new NOORMME({
|
|
|
495
258
|
database: './app.sqlite'
|
|
496
259
|
},
|
|
497
260
|
automation: {
|
|
498
|
-
enableAutoOptimization: true, //
|
|
499
|
-
enableIndexRecommendations: true, //
|
|
500
|
-
enableQueryAnalysis: true, //
|
|
501
|
-
enableMigrationGeneration: true // Auto-generate migrations
|
|
261
|
+
enableAutoOptimization: true, // Make it fast automatically
|
|
262
|
+
enableIndexRecommendations: true, // Suggest better indexes
|
|
263
|
+
enableQueryAnalysis: true, // Find slow queries
|
|
502
264
|
},
|
|
503
265
|
performance: {
|
|
504
|
-
enableCaching: true, //
|
|
505
|
-
|
|
506
|
-
maxCacheSize: 1000 // Maximum cache entries
|
|
507
|
-
}
|
|
508
|
-
})
|
|
509
|
-
```
|
|
510
|
-
|
|
511
|
-
### Advanced Configuration
|
|
512
|
-
```typescript
|
|
513
|
-
const db = new NOORMME({
|
|
514
|
-
dialect: 'sqlite',
|
|
515
|
-
connection: {
|
|
516
|
-
database: './app.sqlite'
|
|
517
|
-
},
|
|
518
|
-
schemaDiscovery: {
|
|
519
|
-
excludeTables: ['migrations', 'temp_*'], // Tables to exclude
|
|
520
|
-
includeViews: true, // Include database views
|
|
521
|
-
customTypeMappings: { // Custom type mappings
|
|
522
|
-
'jsonb': 'Record<string, any>'
|
|
523
|
-
}
|
|
524
|
-
},
|
|
525
|
-
optimization: {
|
|
526
|
-
enableWALMode: true, // Enable WAL mode
|
|
527
|
-
enableForeignKeys: true, // Enable foreign key constraints
|
|
528
|
-
cacheSize: -64000, // 64MB cache size
|
|
529
|
-
synchronous: 'NORMAL', // Synchronous mode
|
|
530
|
-
tempStore: 'MEMORY' // Use memory for temp storage
|
|
266
|
+
enableCaching: true, // Cache results for speed
|
|
267
|
+
maxCacheSize: 1000 // How much to cache
|
|
531
268
|
}
|
|
532
269
|
})
|
|
533
270
|
```
|
|
534
271
|
|
|
535
|
-
##
|
|
536
|
-
|
|
537
|
-
NOORMME's automation delivers measurable performance improvements (because normies care about results, not theory):
|
|
538
|
-
|
|
539
|
-
- **Schema Discovery**: 95% reduction in setup time (start coding in seconds, not hours)
|
|
540
|
-
- **Type Safety**: 100% type coverage with zero manual definitions (TypeScript just works™)
|
|
541
|
-
- **Query Performance**: 20-50% improvement through automatic optimization (databases go brrrr)
|
|
542
|
-
- **Index Efficiency**: 5-10x improvement for targeted queries (smart indexes = fast queries)
|
|
543
|
-
- **Developer Productivity**: 80% reduction in boilerplate code (more coffee breaks!)
|
|
544
|
-
- **Learning Curve**: 99% reduction in "WTF is this?" moments (normie-approved simplicity)
|
|
545
|
-
|
|
546
|
-
## 🚀 Getting Started Guide
|
|
547
|
-
|
|
548
|
-
### 1. Quick Setup
|
|
549
|
-
```bash
|
|
550
|
-
# Install NOORMME
|
|
551
|
-
npm install noormme
|
|
552
|
-
|
|
553
|
-
# Create your project
|
|
554
|
-
mkdir my-sqlite-app && cd my-sqlite-app
|
|
555
|
-
npm init -y
|
|
556
|
-
```
|
|
557
|
-
|
|
558
|
-
### 2. Connect to Your Database
|
|
559
|
-
```typescript
|
|
560
|
-
// app.ts
|
|
561
|
-
import { NOORMME } from 'noormme'
|
|
562
|
-
|
|
563
|
-
const db = new NOORMME({
|
|
564
|
-
dialect: 'sqlite',
|
|
565
|
-
connection: { database: './your-database.sqlite' }
|
|
566
|
-
})
|
|
567
|
-
|
|
568
|
-
async function main() {
|
|
569
|
-
await db.initialize()
|
|
570
|
-
|
|
571
|
-
// Start using auto-generated repositories
|
|
572
|
-
const userRepo = db.getRepository('users')
|
|
573
|
-
const users = await userRepo.findAll()
|
|
574
|
-
|
|
575
|
-
console.log('Users:', users)
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
main().catch(console.error)
|
|
579
|
-
```
|
|
580
|
-
|
|
581
|
-
### 3. Run Your Application
|
|
582
|
-
```bash
|
|
583
|
-
npx tsx app.ts
|
|
584
|
-
```
|
|
272
|
+
## 🚀 Production Ready (Because We're Not Playing Around)
|
|
585
273
|
|
|
586
|
-
|
|
274
|
+
NOORMME is already running in production applications with real-world success stories. It includes:
|
|
587
275
|
|
|
588
|
-
|
|
589
|
-
-
|
|
590
|
-
-
|
|
591
|
-
-
|
|
592
|
-
-
|
|
276
|
+
- **Health monitoring** - Know when something's wrong (because ignorance is not bliss)
|
|
277
|
+
- **Performance metrics** - See how fast your queries are (because speed is life)
|
|
278
|
+
- **Security features** - Protection against common attacks (because security matters)
|
|
279
|
+
- **Migration support** - Move from PostgreSQL to SQLite easily (because change is good)
|
|
280
|
+
- **Backup strategies** - Your data is safe (because data loss is not fun)
|
|
281
|
+
- **WAL Mode implementation** - Proven in production at DreamBeesArt with enterprise-level performance
|
|
593
282
|
|
|
594
|
-
###
|
|
595
|
-
|
|
596
|
-
-
|
|
597
|
-
-
|
|
598
|
-
-
|
|
599
|
-
-
|
|
283
|
+
### **Real Production Success (Because We Don't Make Stuff Up):**
|
|
284
|
+
The DreamBeesArt application successfully migrated from Drizzle ORM to NOORMME with WAL Mode, achieving:
|
|
285
|
+
- **Better concurrent access** - Multiple users can create/edit content simultaneously
|
|
286
|
+
- **Improved write performance** - 3x faster operations with append-only logging
|
|
287
|
+
- **Enhanced reliability** - Better crash recovery and data integrity
|
|
288
|
+
- **Reduced complexity** - From complex database server setup to a single SQLite file
|
|
289
|
+
- **Lower costs** - No database hosting fees while maintaining enterprise performance
|
|
600
290
|
|
|
601
|
-
|
|
602
|
-
- Enable all automation features (why wouldn't you?)
|
|
603
|
-
- Monitor performance metrics (knowledge is power)
|
|
604
|
-
- Apply index recommendations (free performance boost)
|
|
605
|
-
- Set up automated backups (normies backup their stuff)
|
|
606
|
-
- Use `--dry-run` first (test before you wreck)
|
|
291
|
+
## ❓ FAQ for Normies (The Questions You're Too Afraid to Ask)
|
|
607
292
|
|
|
608
|
-
|
|
293
|
+
**Q: Do I need to learn SQL?**
|
|
294
|
+
A: Nope! NOORMME handles most things automatically. You only need SQL for complex queries (and even then, we'll help you).
|
|
609
295
|
|
|
610
|
-
|
|
296
|
+
**Q: Can I use my existing database?**
|
|
297
|
+
A: Yes! Just point NOORMME at your existing SQLite file and it figures everything out (because we're not picky).
|
|
611
298
|
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
// Ensure database file exists and is accessible
|
|
615
|
-
const db = new NOORMME({
|
|
616
|
-
dialect: 'sqlite',
|
|
617
|
-
connection: { database: './app.sqlite' }
|
|
618
|
-
})
|
|
299
|
+
**Q: Is this really production-ready?**
|
|
300
|
+
A: Absolutely. Real applications are using it right now with better performance than PostgreSQL (because we're not lying).
|
|
619
301
|
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
} catch (error) {
|
|
623
|
-
console.error('Connection failed:', error.message)
|
|
624
|
-
}
|
|
625
|
-
```
|
|
302
|
+
**Q: What if I'm already using another ORM?**
|
|
303
|
+
A: NOORMME works alongside other tools. You can migrate gradually or use both (because we're not territorial).
|
|
626
304
|
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
// Check what tables were discovered
|
|
630
|
-
const schemaInfo = await db.getSchemaInfo()
|
|
631
|
-
console.log('Discovered tables:', schemaInfo.tables.map(t => t.name))
|
|
305
|
+
**Q: Do I need TypeScript?**
|
|
306
|
+
A: NOORMME works with JavaScript too, but TypeScript gives you the best experience (because types are your friends).
|
|
632
307
|
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
console.log('Table columns:', tableInfo.columns)
|
|
636
|
-
```
|
|
308
|
+
**Q: How does this work with AI tools like Cursor?**
|
|
309
|
+
A: NOORMME includes Cursor IDE context rules that make AI assistance actually useful. The AI understands your project structure and generates code that follows your conventions (because we're not savages).
|
|
637
310
|
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
// Get optimization recommendations
|
|
641
|
-
const optimizations = await db.getSQLiteOptimizations()
|
|
642
|
-
console.log('Optimization suggestions:', optimizations.recommendations)
|
|
311
|
+
**Q: What makes this different from other toolkits?**
|
|
312
|
+
A: NOORMME combines database automation, organized architecture, and AI-ready patterns in one integrated toolkit. It's not just an ORM - it's a complete development environment (because we're ambitious).
|
|
643
313
|
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
console.log('Slow queries detected:', slowQueries)
|
|
647
|
-
```
|
|
314
|
+
**Q: Will this make me a better developer?**
|
|
315
|
+
A: Probably not, but it will make you feel like one (which is half the battle).
|
|
648
316
|
|
|
649
|
-
## 🤝 Contributing
|
|
317
|
+
## 🤝 Contributing (Because We're Not Perfect)
|
|
650
318
|
|
|
651
|
-
We
|
|
319
|
+
Found a bug? Have an idea? We'd love your help! (Because we're not too proud to ask for help)
|
|
652
320
|
|
|
653
|
-
### Development Setup
|
|
654
321
|
```bash
|
|
655
|
-
# Clone the repository
|
|
656
322
|
git clone https://github.com/cardsorting/noormme.git
|
|
657
323
|
cd noormme
|
|
658
|
-
|
|
659
|
-
# Install dependencies
|
|
660
324
|
npm install
|
|
661
|
-
|
|
662
|
-
# Run tests
|
|
663
325
|
npm test
|
|
664
|
-
|
|
665
|
-
# Build the project
|
|
666
|
-
npm run build
|
|
667
326
|
```
|
|
668
327
|
|
|
669
|
-
## 📄 License
|
|
670
|
-
|
|
671
|
-
MIT License - see [LICENSE](LICENSE) file for details.
|
|
328
|
+
## 📄 License (The Legal Stuff)
|
|
672
329
|
|
|
673
|
-
|
|
330
|
+
Apache 2.0 License - see [LICENSE](LICENSE) file for details. (Because we're not lawyers, but we try to be responsible)
|
|
674
331
|
|
|
675
|
-
|
|
676
|
-
- **SQLite**: The robust, embedded database that makes automation possible
|
|
677
|
-
- **TypeScript**: Enabling type safety and intelligent development experience
|
|
332
|
+
## 🎉 Start Today (Because Tomorrow Is Overrated)
|
|
678
333
|
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
Ready to join the normie revolution? Install NOORMME and watch your database work for you:
|
|
334
|
+
Ready to make your development environment work for you instead of against you?
|
|
682
335
|
|
|
683
336
|
```bash
|
|
684
337
|
npm install noormme
|
|
685
338
|
```
|
|
686
339
|
|
|
687
|
-
**Because
|
|
688
|
-
|
|
689
|
-
---
|
|
690
|
-
|
|
691
|
-
## 🤓 FAQ for Normies
|
|
692
|
-
|
|
693
|
-
**Q: Is NOORMME really pronounced "normie"?**
|
|
694
|
-
A: Yes! It's **NO-ORM-ME** → **NOORMME** → **normie**. We're bringing database automation back to normal people.
|
|
695
|
-
|
|
696
|
-
**Q: What does NO-ORM actually mean?**
|
|
697
|
-
A: It means you don't need a traditional ORM with all its complexity. NOORMME gives you automation without the abstraction overload. It's not "just another ORM" - it's the anti-ORM.
|
|
698
|
-
|
|
699
|
-
**Q: Is this just for normies?**
|
|
700
|
-
A: Absolutely not! Power users love NOORMME too. But unlike other tools, you don't need to be a database wizard to use it. That's the point.
|
|
701
|
-
|
|
702
|
-
**Q: Do I need to learn Kysely to use NOORMME?**
|
|
703
|
-
A: Nope! NOORMME auto-generates repositories for 90% of your needs. Only drop down to Kysely for complex queries. And when you do, you'll have full type safety.
|
|
704
|
-
|
|
705
|
-
**Q: Can I use this in production?**
|
|
706
|
-
A: Yes! NOORMME is built on Kysely, which is battle-tested and production-ready. The automation layer just makes your life easier.
|
|
707
|
-
|
|
708
|
-
**Q: What if I already have a database?**
|
|
709
|
-
A: Perfect! That's NOORMME's specialty. Point it at your existing SQLite database and it automatically discovers everything. No migration to a new ORM needed.
|
|
710
|
-
|
|
711
|
-
**Q: Is it really zero configuration?**
|
|
712
|
-
A: For basic usage, yes! Just give it a database path. For advanced tuning, there are plenty of options - but you don't need them to get started.
|
|
713
|
-
|
|
714
|
-
---
|
|
715
|
-
|
|
716
|
-
## 🎭 The Normie Manifesto
|
|
717
|
-
|
|
718
|
-
1. **Databases should work for you**, not the other way around
|
|
719
|
-
2. **Automation beats configuration** every single time
|
|
720
|
-
3. **Type safety** should be automatic, not aspirational
|
|
721
|
-
4. **Performance** should be a default, not an afterthought
|
|
722
|
-
5. **Complexity** is a bug, not a feature
|
|
723
|
-
6. **Normies** deserve great developer tools too
|
|
340
|
+
**Because AI-assisted development should be normal, not rocket science.** 🚀
|
|
724
341
|
|
|
725
342
|
---
|
|
726
343
|
|
|
727
|
-
*NOORMME -
|
|
344
|
+
*NOORMME - Making AI-assisted development so simple, even normies can use it.*
|