@bloomneo/appkit 1.2.9
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 +21 -0
- package/README.md +902 -0
- package/bin/appkit.js +71 -0
- package/bin/commands/generate.js +1050 -0
- package/bin/templates/backend/README.md.template +39 -0
- package/bin/templates/backend/api.http.template +0 -0
- package/bin/templates/backend/docs/APPKIT_CLI.md +507 -0
- package/bin/templates/backend/docs/APPKIT_COMMENTS_GUIDELINES.md +61 -0
- package/bin/templates/backend/docs/APPKIT_LLM_GUIDE.md +2539 -0
- package/bin/templates/backend/package.json.template +34 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.http.template +29 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.route.ts.template +36 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.service.ts.template +88 -0
- package/bin/templates/backend/src/api/features/welcome/welcome.types.ts.template +18 -0
- package/bin/templates/backend/src/api/lib/api-router.ts.template +84 -0
- package/bin/templates/backend/src/api/server.ts.template +188 -0
- package/bin/templates/backend/tsconfig.api.json.template +24 -0
- package/bin/templates/backend/tsconfig.json.template +40 -0
- package/bin/templates/feature/feature.http.template +63 -0
- package/bin/templates/feature/feature.route.ts.template +36 -0
- package/bin/templates/feature/feature.service.ts.template +81 -0
- package/bin/templates/feature/feature.types.ts.template +23 -0
- package/bin/templates/feature-db/feature.http.template +63 -0
- package/bin/templates/feature-db/feature.model.ts.template +74 -0
- package/bin/templates/feature-db/feature.route.ts.template +58 -0
- package/bin/templates/feature-db/feature.service.ts.template +231 -0
- package/bin/templates/feature-db/feature.types.ts.template +25 -0
- package/bin/templates/feature-db/schema-addition.prisma.template +9 -0
- package/bin/templates/feature-db/seeding/README.md.template +57 -0
- package/bin/templates/feature-db/seeding/feature.seed.js.template +67 -0
- package/bin/templates/feature-user/schema-addition.prisma.template +19 -0
- package/bin/templates/feature-user/user.http.template +157 -0
- package/bin/templates/feature-user/user.model.ts.template +244 -0
- package/bin/templates/feature-user/user.route.ts.template +379 -0
- package/bin/templates/feature-user/user.seed.js.template +182 -0
- package/bin/templates/feature-user/user.service.ts.template +426 -0
- package/bin/templates/feature-user/user.types.ts.template +127 -0
- package/dist/auth/auth.d.ts +182 -0
- package/dist/auth/auth.d.ts.map +1 -0
- package/dist/auth/auth.js +477 -0
- package/dist/auth/auth.js.map +1 -0
- package/dist/auth/defaults.d.ts +104 -0
- package/dist/auth/defaults.d.ts.map +1 -0
- package/dist/auth/defaults.js +374 -0
- package/dist/auth/defaults.js.map +1 -0
- package/dist/auth/index.d.ts +70 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +94 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/cache/cache.d.ts +118 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +249 -0
- package/dist/cache/cache.js.map +1 -0
- package/dist/cache/defaults.d.ts +63 -0
- package/dist/cache/defaults.d.ts.map +1 -0
- package/dist/cache/defaults.js +193 -0
- package/dist/cache/defaults.js.map +1 -0
- package/dist/cache/index.d.ts +101 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +203 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/strategies/memory.d.ts +138 -0
- package/dist/cache/strategies/memory.d.ts.map +1 -0
- package/dist/cache/strategies/memory.js +348 -0
- package/dist/cache/strategies/memory.js.map +1 -0
- package/dist/cache/strategies/redis.d.ts +105 -0
- package/dist/cache/strategies/redis.d.ts.map +1 -0
- package/dist/cache/strategies/redis.js +318 -0
- package/dist/cache/strategies/redis.js.map +1 -0
- package/dist/config/config.d.ts +62 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +107 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/defaults.d.ts +44 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +217 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +105 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +163 -0
- package/dist/config/index.js.map +1 -0
- package/dist/database/adapters/mongoose.d.ts +106 -0
- package/dist/database/adapters/mongoose.d.ts.map +1 -0
- package/dist/database/adapters/mongoose.js +480 -0
- package/dist/database/adapters/mongoose.js.map +1 -0
- package/dist/database/adapters/prisma.d.ts +106 -0
- package/dist/database/adapters/prisma.d.ts.map +1 -0
- package/dist/database/adapters/prisma.js +494 -0
- package/dist/database/adapters/prisma.js.map +1 -0
- package/dist/database/defaults.d.ts +87 -0
- package/dist/database/defaults.d.ts.map +1 -0
- package/dist/database/defaults.js +271 -0
- package/dist/database/defaults.js.map +1 -0
- package/dist/database/index.d.ts +137 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +490 -0
- package/dist/database/index.js.map +1 -0
- package/dist/email/defaults.d.ts +100 -0
- package/dist/email/defaults.d.ts.map +1 -0
- package/dist/email/defaults.js +400 -0
- package/dist/email/defaults.js.map +1 -0
- package/dist/email/email.d.ts +139 -0
- package/dist/email/email.d.ts.map +1 -0
- package/dist/email/email.js +316 -0
- package/dist/email/email.js.map +1 -0
- package/dist/email/index.d.ts +176 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +251 -0
- package/dist/email/index.js.map +1 -0
- package/dist/email/strategies/console.d.ts +90 -0
- package/dist/email/strategies/console.d.ts.map +1 -0
- package/dist/email/strategies/console.js +268 -0
- package/dist/email/strategies/console.js.map +1 -0
- package/dist/email/strategies/resend.d.ts +84 -0
- package/dist/email/strategies/resend.d.ts.map +1 -0
- package/dist/email/strategies/resend.js +266 -0
- package/dist/email/strategies/resend.js.map +1 -0
- package/dist/email/strategies/smtp.d.ts +77 -0
- package/dist/email/strategies/smtp.d.ts.map +1 -0
- package/dist/email/strategies/smtp.js +286 -0
- package/dist/email/strategies/smtp.js.map +1 -0
- package/dist/error/defaults.d.ts +40 -0
- package/dist/error/defaults.d.ts.map +1 -0
- package/dist/error/defaults.js +75 -0
- package/dist/error/defaults.js.map +1 -0
- package/dist/error/error.d.ts +140 -0
- package/dist/error/error.d.ts.map +1 -0
- package/dist/error/error.js +200 -0
- package/dist/error/error.js.map +1 -0
- package/dist/error/index.d.ts +145 -0
- package/dist/error/index.d.ts.map +1 -0
- package/dist/error/index.js +145 -0
- package/dist/error/index.js.map +1 -0
- package/dist/event/defaults.d.ts +111 -0
- package/dist/event/defaults.d.ts.map +1 -0
- package/dist/event/defaults.js +378 -0
- package/dist/event/defaults.js.map +1 -0
- package/dist/event/event.d.ts +171 -0
- package/dist/event/event.d.ts.map +1 -0
- package/dist/event/event.js +391 -0
- package/dist/event/event.js.map +1 -0
- package/dist/event/index.d.ts +173 -0
- package/dist/event/index.d.ts.map +1 -0
- package/dist/event/index.js +302 -0
- package/dist/event/index.js.map +1 -0
- package/dist/event/strategies/memory.d.ts +122 -0
- package/dist/event/strategies/memory.d.ts.map +1 -0
- package/dist/event/strategies/memory.js +331 -0
- package/dist/event/strategies/memory.js.map +1 -0
- package/dist/event/strategies/redis.d.ts +115 -0
- package/dist/event/strategies/redis.d.ts.map +1 -0
- package/dist/event/strategies/redis.js +434 -0
- package/dist/event/strategies/redis.js.map +1 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/defaults.d.ts +67 -0
- package/dist/logger/defaults.d.ts.map +1 -0
- package/dist/logger/defaults.js +213 -0
- package/dist/logger/defaults.js.map +1 -0
- package/dist/logger/index.d.ts +84 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +101 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/logger.d.ts +165 -0
- package/dist/logger/logger.d.ts.map +1 -0
- package/dist/logger/logger.js +843 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/logger/transports/console.d.ts +102 -0
- package/dist/logger/transports/console.d.ts.map +1 -0
- package/dist/logger/transports/console.js +276 -0
- package/dist/logger/transports/console.js.map +1 -0
- package/dist/logger/transports/database.d.ts +153 -0
- package/dist/logger/transports/database.d.ts.map +1 -0
- package/dist/logger/transports/database.js +539 -0
- package/dist/logger/transports/database.js.map +1 -0
- package/dist/logger/transports/file.d.ts +146 -0
- package/dist/logger/transports/file.d.ts.map +1 -0
- package/dist/logger/transports/file.js +464 -0
- package/dist/logger/transports/file.js.map +1 -0
- package/dist/logger/transports/http.d.ts +128 -0
- package/dist/logger/transports/http.d.ts.map +1 -0
- package/dist/logger/transports/http.js +401 -0
- package/dist/logger/transports/http.js.map +1 -0
- package/dist/logger/transports/webhook.d.ts +152 -0
- package/dist/logger/transports/webhook.d.ts.map +1 -0
- package/dist/logger/transports/webhook.js +485 -0
- package/dist/logger/transports/webhook.js.map +1 -0
- package/dist/queue/defaults.d.ts +66 -0
- package/dist/queue/defaults.d.ts.map +1 -0
- package/dist/queue/defaults.js +205 -0
- package/dist/queue/defaults.js.map +1 -0
- package/dist/queue/index.d.ts +124 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +116 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/queue.d.ts +156 -0
- package/dist/queue/queue.d.ts.map +1 -0
- package/dist/queue/queue.js +387 -0
- package/dist/queue/queue.js.map +1 -0
- package/dist/queue/transports/database.d.ts +165 -0
- package/dist/queue/transports/database.d.ts.map +1 -0
- package/dist/queue/transports/database.js +595 -0
- package/dist/queue/transports/database.js.map +1 -0
- package/dist/queue/transports/memory.d.ts +143 -0
- package/dist/queue/transports/memory.d.ts.map +1 -0
- package/dist/queue/transports/memory.js +415 -0
- package/dist/queue/transports/memory.js.map +1 -0
- package/dist/queue/transports/redis.d.ts +203 -0
- package/dist/queue/transports/redis.d.ts.map +1 -0
- package/dist/queue/transports/redis.js +744 -0
- package/dist/queue/transports/redis.js.map +1 -0
- package/dist/security/defaults.d.ts +64 -0
- package/dist/security/defaults.d.ts.map +1 -0
- package/dist/security/defaults.js +159 -0
- package/dist/security/defaults.js.map +1 -0
- package/dist/security/index.d.ts +110 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +160 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/security.d.ts +138 -0
- package/dist/security/security.d.ts.map +1 -0
- package/dist/security/security.js +419 -0
- package/dist/security/security.js.map +1 -0
- package/dist/storage/defaults.d.ts +79 -0
- package/dist/storage/defaults.d.ts.map +1 -0
- package/dist/storage/defaults.js +358 -0
- package/dist/storage/defaults.js.map +1 -0
- package/dist/storage/index.d.ts +153 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +242 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/storage.d.ts +151 -0
- package/dist/storage/storage.d.ts.map +1 -0
- package/dist/storage/storage.js +439 -0
- package/dist/storage/storage.js.map +1 -0
- package/dist/storage/strategies/local.d.ts +117 -0
- package/dist/storage/strategies/local.d.ts.map +1 -0
- package/dist/storage/strategies/local.js +368 -0
- package/dist/storage/strategies/local.js.map +1 -0
- package/dist/storage/strategies/r2.d.ts +130 -0
- package/dist/storage/strategies/r2.d.ts.map +1 -0
- package/dist/storage/strategies/r2.js +470 -0
- package/dist/storage/strategies/r2.js.map +1 -0
- package/dist/storage/strategies/s3.d.ts +121 -0
- package/dist/storage/strategies/s3.d.ts.map +1 -0
- package/dist/storage/strategies/s3.js +461 -0
- package/dist/storage/strategies/s3.js.map +1 -0
- package/dist/util/defaults.d.ts +77 -0
- package/dist/util/defaults.d.ts.map +1 -0
- package/dist/util/defaults.js +193 -0
- package/dist/util/defaults.js.map +1 -0
- package/dist/util/index.d.ts +97 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +165 -0
- package/dist/util/index.js.map +1 -0
- package/dist/util/util.d.ts +145 -0
- package/dist/util/util.d.ts.map +1 -0
- package/dist/util/util.js +481 -0
- package/dist/util/util.js.map +1 -0
- package/package.json +234 -0
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simplified defaults and validation for AppKit Database
|
|
3
|
+
* Environment-driven configuration with smart detection
|
|
4
|
+
*
|
|
5
|
+
* Required Environment Variables:
|
|
6
|
+
* - DATABASE_URL: Database connection string
|
|
7
|
+
*
|
|
8
|
+
* Optional Environment Variables:
|
|
9
|
+
* - VOILA_DB_TENANT: Enable tenant mode (auto/true/false)
|
|
10
|
+
* - ORG_{NAME}: Organization-specific database URLs
|
|
11
|
+
*
|
|
12
|
+
* @module @bloomneo/appkit/database
|
|
13
|
+
* @file src/database/defaults.js
|
|
14
|
+
*
|
|
15
|
+
* @llm-rule WHEN: App startup - need to validate database environment configuration
|
|
16
|
+
* @llm-rule AVOID: Calling multiple times - expensive validation, use once at startup
|
|
17
|
+
* @llm-rule NOTE: All tenant tables MUST have tenant_id text field (nullable)
|
|
18
|
+
*/
|
|
19
|
+
export function validateTenantId(tenantId) {
|
|
20
|
+
return typeof tenantId === 'string' && /^[a-zA-Z0-9_-]+$/.test(tenantId) && tenantId.length <= 63;
|
|
21
|
+
}
|
|
22
|
+
export function validateOrgId(orgId) {
|
|
23
|
+
return typeof orgId === 'string' && /^[a-zA-Z0-9_-]+$/.test(orgId) && orgId.length <= 63;
|
|
24
|
+
}
|
|
25
|
+
export function validateDatabaseUrl(url) {
|
|
26
|
+
if (!url || typeof url !== 'string')
|
|
27
|
+
return false;
|
|
28
|
+
if (!url.includes('://'))
|
|
29
|
+
return false;
|
|
30
|
+
if (url.includes('..') || url.includes('<') || url.includes('>'))
|
|
31
|
+
return false;
|
|
32
|
+
return [
|
|
33
|
+
'postgresql://', 'postgres://', 'mysql://',
|
|
34
|
+
'mongodb://', 'mongodb+srv://', 'sqlite://'
|
|
35
|
+
].some(protocol => url.startsWith(protocol));
|
|
36
|
+
}
|
|
37
|
+
class DatabaseError extends Error {
|
|
38
|
+
statusCode;
|
|
39
|
+
details; // or use a more specific type like `Record<string, any>`
|
|
40
|
+
constructor(message, statusCode = 500, details = null) {
|
|
41
|
+
super(message);
|
|
42
|
+
this.name = 'DatabaseError';
|
|
43
|
+
this.statusCode = statusCode;
|
|
44
|
+
this.details = details;
|
|
45
|
+
if (Error.captureStackTrace) {
|
|
46
|
+
Error.captureStackTrace(this, DatabaseError);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export function createDatabaseError(message, statusCode = 500, details = null) {
|
|
51
|
+
return new DatabaseError(message, statusCode, details);
|
|
52
|
+
}
|
|
53
|
+
export function detectProvider(url) {
|
|
54
|
+
if (!url)
|
|
55
|
+
return 'unknown';
|
|
56
|
+
if (url.includes('postgresql://') || url.includes('postgres://'))
|
|
57
|
+
return 'postgresql';
|
|
58
|
+
if (url.includes('mysql://'))
|
|
59
|
+
return 'mysql';
|
|
60
|
+
if (url.includes('mongodb://') || url.includes('mongodb+srv://'))
|
|
61
|
+
return 'mongodb';
|
|
62
|
+
if (url.includes('sqlite://'))
|
|
63
|
+
return 'sqlite';
|
|
64
|
+
return 'unknown';
|
|
65
|
+
}
|
|
66
|
+
export function detectAdapter(url) {
|
|
67
|
+
const provider = detectProvider(url);
|
|
68
|
+
if (provider === 'mongodb')
|
|
69
|
+
return 'mongoose';
|
|
70
|
+
return 'prisma';
|
|
71
|
+
}
|
|
72
|
+
export function sanitizeDatabaseName(name) {
|
|
73
|
+
if (!name || typeof name !== 'string') {
|
|
74
|
+
throw createDatabaseError('Database name must be a non-empty string', 400);
|
|
75
|
+
}
|
|
76
|
+
return name.toLowerCase().replace(/[^a-z0-9_-]/g, '_');
|
|
77
|
+
}
|
|
78
|
+
export function getOrgEnvironmentVars() {
|
|
79
|
+
const orgVars = {};
|
|
80
|
+
Object.keys(process.env).forEach(key => {
|
|
81
|
+
if (key.startsWith('ORG_') && key !== 'ORG_') {
|
|
82
|
+
const orgId = key.replace('ORG_', '').toLowerCase();
|
|
83
|
+
const url = process.env[key];
|
|
84
|
+
if (url && validateDatabaseUrl(url)) {
|
|
85
|
+
orgVars[orgId] = url;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
console.warn(`Invalid database URL for organization '${orgId}': ${url}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
return orgVars;
|
|
93
|
+
}
|
|
94
|
+
export function validateEnvironment() {
|
|
95
|
+
const errors = [];
|
|
96
|
+
const warnings = [];
|
|
97
|
+
const config = {
|
|
98
|
+
valid: true,
|
|
99
|
+
errors,
|
|
100
|
+
warnings,
|
|
101
|
+
hasDatabase: false,
|
|
102
|
+
hasTenants: false,
|
|
103
|
+
hasOrgs: false,
|
|
104
|
+
orgCount: 0,
|
|
105
|
+
};
|
|
106
|
+
const databaseUrl = process.env.DATABASE_URL;
|
|
107
|
+
if (!databaseUrl) {
|
|
108
|
+
errors.push('DATABASE_URL environment variable is required');
|
|
109
|
+
}
|
|
110
|
+
else if (!validateDatabaseUrl(databaseUrl)) {
|
|
111
|
+
errors.push(`Invalid DATABASE_URL format: ${databaseUrl}`);
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
config.hasDatabase = true;
|
|
115
|
+
}
|
|
116
|
+
const tenantMode = process.env.VOILA_DB_TENANT;
|
|
117
|
+
if (tenantMode) {
|
|
118
|
+
const mode = tenantMode.toLowerCase();
|
|
119
|
+
if (['true', 'auto'].includes(mode)) {
|
|
120
|
+
config.hasTenants = true;
|
|
121
|
+
}
|
|
122
|
+
else if (mode !== 'false') {
|
|
123
|
+
warnings.push(`Unknown VOILA_DB_TENANT value: ${tenantMode}. Use 'auto', 'true', or 'false'`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const orgVars = getOrgEnvironmentVars();
|
|
127
|
+
config.orgCount = Object.keys(orgVars).length;
|
|
128
|
+
config.hasOrgs = config.orgCount > 0;
|
|
129
|
+
Object.keys(orgVars).forEach(orgId => {
|
|
130
|
+
if (!validateOrgId(orgId)) {
|
|
131
|
+
warnings.push(`Invalid organization ID format: ${orgId}`);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
const nodeEnv = process.env.NODE_ENV;
|
|
135
|
+
if (!nodeEnv) {
|
|
136
|
+
warnings.push('NODE_ENV not set. Defaulting to development mode');
|
|
137
|
+
}
|
|
138
|
+
else if (!['development', 'production', 'test'].includes(nodeEnv)) {
|
|
139
|
+
warnings.push(`Unusual NODE_ENV value: ${nodeEnv}`);
|
|
140
|
+
}
|
|
141
|
+
if (config.hasTenants && !config.hasDatabase) {
|
|
142
|
+
errors.push('Tenant mode enabled but no valid DATABASE_URL found');
|
|
143
|
+
}
|
|
144
|
+
if (config.hasOrgs && config.orgCount > 10) {
|
|
145
|
+
warnings.push(`Large number of organizations configured (${config.orgCount}). Consider using dynamic URL resolution`);
|
|
146
|
+
}
|
|
147
|
+
config.valid = errors.length === 0;
|
|
148
|
+
return config;
|
|
149
|
+
}
|
|
150
|
+
export function getSmartDefaults() {
|
|
151
|
+
const isDevelopment = process.env.NODE_ENV === 'development';
|
|
152
|
+
const isProduction = process.env.NODE_ENV === 'production';
|
|
153
|
+
const validation = validateEnvironment();
|
|
154
|
+
if (isDevelopment && validation.warnings.length > 0) {
|
|
155
|
+
console.warn('⚠️ [AppKit] Database configuration warnings:');
|
|
156
|
+
validation.warnings.forEach((w) => console.warn(` ${w}`));
|
|
157
|
+
}
|
|
158
|
+
if (!validation.valid) {
|
|
159
|
+
throw createDatabaseError(`Database configuration errors:\n${validation.errors.join('\n')}`, 500, { validation });
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
database: {
|
|
163
|
+
url: process.env.DATABASE_URL || '',
|
|
164
|
+
provider: detectProvider(process.env.DATABASE_URL || ''),
|
|
165
|
+
adapter: detectAdapter(process.env.DATABASE_URL || ''),
|
|
166
|
+
},
|
|
167
|
+
tenant: {
|
|
168
|
+
enabled: validation.hasTenants,
|
|
169
|
+
mode: process.env.VOILA_DB_TENANT?.toLowerCase() || 'false',
|
|
170
|
+
fieldName: 'tenant_id',
|
|
171
|
+
},
|
|
172
|
+
org: {
|
|
173
|
+
enabled: validation.hasOrgs,
|
|
174
|
+
count: validation.orgCount,
|
|
175
|
+
urls: getOrgEnvironmentVars(),
|
|
176
|
+
},
|
|
177
|
+
environment: {
|
|
178
|
+
isDevelopment,
|
|
179
|
+
isProduction,
|
|
180
|
+
nodeEnv: process.env.NODE_ENV || 'development',
|
|
181
|
+
},
|
|
182
|
+
validation,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
export async function validateSchema(client, requiredField = 'tenant_id') {
|
|
186
|
+
if (process.env.NODE_ENV !== 'development')
|
|
187
|
+
return { valid: true, warnings: [] };
|
|
188
|
+
const warnings = [];
|
|
189
|
+
try {
|
|
190
|
+
if (client.$queryRaw) {
|
|
191
|
+
const models = Object.keys(client).filter(key => typeof client[key] === 'object' && typeof client[key].findFirst === 'function');
|
|
192
|
+
for (const model of models) {
|
|
193
|
+
try {
|
|
194
|
+
await client[model].findFirst({ where: { [requiredField]: null }, take: 1 });
|
|
195
|
+
}
|
|
196
|
+
catch (e) {
|
|
197
|
+
if (e.message.includes(requiredField)) {
|
|
198
|
+
warnings.push(`Prisma model '${model}' missing field '${requiredField}'`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
else if (client.models) {
|
|
204
|
+
const models = Object.keys(client.models);
|
|
205
|
+
for (const modelName of models) {
|
|
206
|
+
const model = client.models[modelName];
|
|
207
|
+
if (!model.schema.paths[requiredField]) {
|
|
208
|
+
warnings.push(`Mongoose model '${modelName}' missing field '${requiredField}'`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return { valid: warnings.length === 0, warnings };
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
return { valid: false, warnings: [`Schema validation failed: ${error.message}`] };
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
export function formatBytes(bytes) {
|
|
219
|
+
if (bytes === 0)
|
|
220
|
+
return '0 B';
|
|
221
|
+
const k = 1024;
|
|
222
|
+
const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
223
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
224
|
+
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;
|
|
225
|
+
}
|
|
226
|
+
export function maskUrl(url) {
|
|
227
|
+
if (!url || typeof url !== 'string')
|
|
228
|
+
return '[invalid-url]';
|
|
229
|
+
try {
|
|
230
|
+
return url.replace(/:\/\/[^@]*@/, '://***:***@');
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
return '[masked-url]';
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
export function getConfigSummary() {
|
|
237
|
+
const config = getSmartDefaults();
|
|
238
|
+
return {
|
|
239
|
+
database: {
|
|
240
|
+
provider: config.database.provider,
|
|
241
|
+
adapter: config.database.adapter,
|
|
242
|
+
url: maskUrl(config.database.url || ''),
|
|
243
|
+
},
|
|
244
|
+
tenant: {
|
|
245
|
+
enabled: config.tenant.enabled,
|
|
246
|
+
mode: config.tenant.mode,
|
|
247
|
+
},
|
|
248
|
+
org: {
|
|
249
|
+
enabled: config.org.enabled,
|
|
250
|
+
count: config.org.count,
|
|
251
|
+
organizations: Object.keys(config.org.urls),
|
|
252
|
+
},
|
|
253
|
+
environment: config.environment.nodeEnv,
|
|
254
|
+
validation: {
|
|
255
|
+
valid: config.validation.valid,
|
|
256
|
+
warningCount: config.validation.warnings.length,
|
|
257
|
+
errorCount: config.validation.errors.length,
|
|
258
|
+
},
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
let cachedValidation = null;
|
|
262
|
+
export function getCachedValidation() {
|
|
263
|
+
if (!cachedValidation) {
|
|
264
|
+
cachedValidation = validateEnvironment();
|
|
265
|
+
}
|
|
266
|
+
return cachedValidation;
|
|
267
|
+
}
|
|
268
|
+
export function clearValidationCache() {
|
|
269
|
+
cachedValidation = null;
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/database/defaults.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ultra-simple database API with org/tenant support and smart connection management
|
|
3
|
+
* @module @bloomneo/appkit/database
|
|
4
|
+
* @file src/database/index.ts
|
|
5
|
+
*
|
|
6
|
+
* @llm-rule WHEN: ALWAYS add tenant_id text field to ALL tables (nullable for future compatibility)
|
|
7
|
+
* @llm-rule NOTE: tenant_id = null (single tenant) or "team-1" (multi-tenant)
|
|
8
|
+
* @llm-rule VARIABLE: const db = await databaseClass.get() - user's data (single or tenant-filtered)
|
|
9
|
+
* @llm-rule VARIABLE: const dbTenants = await databaseClass.getTenants() - all tenants (admin access)
|
|
10
|
+
* @llm-rule VARIABLE: const {orgName}Db = await databaseClass.org('{orgName}').get() - org-specific data
|
|
11
|
+
* @llm-rule VARIABLE: const {orgName}DbTenants = await databaseClass.org('{orgName}').getTenants() - all tenants in org
|
|
12
|
+
*/
|
|
13
|
+
interface DatabaseClient {
|
|
14
|
+
_appKit?: boolean;
|
|
15
|
+
_orgId?: string;
|
|
16
|
+
_tenantId?: string;
|
|
17
|
+
_url?: string;
|
|
18
|
+
[key: string]: any;
|
|
19
|
+
}
|
|
20
|
+
interface PrismaClient extends DatabaseClient {
|
|
21
|
+
$queryRaw?: any;
|
|
22
|
+
$disconnect: () => Promise<void>;
|
|
23
|
+
$connect: () => Promise<void>;
|
|
24
|
+
$use?: (middleware: any) => void;
|
|
25
|
+
}
|
|
26
|
+
interface MongooseConnection extends DatabaseClient {
|
|
27
|
+
db: any;
|
|
28
|
+
close: () => Promise<void>;
|
|
29
|
+
model: (name: string, schema?: any, collection?: string) => any;
|
|
30
|
+
models: Record<string, any>;
|
|
31
|
+
on: (event: string, callback: (...args: any[]) => void) => void;
|
|
32
|
+
}
|
|
33
|
+
type DatabaseClientUnion = PrismaClient | MongooseConnection;
|
|
34
|
+
/**
|
|
35
|
+
* Organization database builder
|
|
36
|
+
*/
|
|
37
|
+
declare class OrgDatabase {
|
|
38
|
+
private orgId;
|
|
39
|
+
constructor(orgId: string);
|
|
40
|
+
/**
|
|
41
|
+
* Get organization database (tenant-filtered if tenant mode enabled)
|
|
42
|
+
*/
|
|
43
|
+
get(req?: any): Promise<DatabaseClientUnion>;
|
|
44
|
+
/**
|
|
45
|
+
* Get all tenants in organization (admin access)
|
|
46
|
+
*/
|
|
47
|
+
getTenants(req?: any): Promise<DatabaseClientUnion>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Main database API - ultra-simple like auth module
|
|
51
|
+
*/
|
|
52
|
+
export declare const databaseClass: {
|
|
53
|
+
/**
|
|
54
|
+
* Get database client - main function that handles all contexts
|
|
55
|
+
* @param {Object} [req] - Request object for context detection
|
|
56
|
+
* @returns {Promise<DatabaseClientUnion>} Database client
|
|
57
|
+
*/
|
|
58
|
+
get(req?: any): Promise<DatabaseClientUnion>;
|
|
59
|
+
/**
|
|
60
|
+
* Get all tenants data (admin access - no tenant filtering)
|
|
61
|
+
* @param {Object} [req] - Request object for org context
|
|
62
|
+
* @returns {Promise<DatabaseClientUnion>} Database client with no tenant filtering
|
|
63
|
+
*/
|
|
64
|
+
getTenants(req?: any): Promise<DatabaseClientUnion>;
|
|
65
|
+
/**
|
|
66
|
+
* Get organization-specific database
|
|
67
|
+
* @param {string} orgId - Organization ID
|
|
68
|
+
* @returns {OrgDatabase} Organization database instance
|
|
69
|
+
*/
|
|
70
|
+
org(orgId: string): OrgDatabase;
|
|
71
|
+
/**
|
|
72
|
+
* Health check for database connections
|
|
73
|
+
* @returns {Promise<Object>} Health status
|
|
74
|
+
*/
|
|
75
|
+
health(): Promise<any>;
|
|
76
|
+
/**
|
|
77
|
+
* List tenants in current context
|
|
78
|
+
* @param {Object} [req] - Request object for org context
|
|
79
|
+
* @returns {Promise<string[]>} Array of tenant IDs
|
|
80
|
+
*/
|
|
81
|
+
list(req?: any): Promise<string[]>;
|
|
82
|
+
/**
|
|
83
|
+
* Check if tenant exists
|
|
84
|
+
* @param {string} tenantId - Tenant ID
|
|
85
|
+
* @param {Object} [req] - Request object for org context
|
|
86
|
+
* @returns {Promise<boolean>} Whether tenant exists
|
|
87
|
+
*/
|
|
88
|
+
exists(tenantId: string, req?: any): Promise<boolean>;
|
|
89
|
+
/**
|
|
90
|
+
* Create tenant (registers tenant for future use)
|
|
91
|
+
* @param {string} tenantId - Tenant ID
|
|
92
|
+
* @param {Object} [req] - Request object for org context
|
|
93
|
+
* @returns {Promise<void>}
|
|
94
|
+
*/
|
|
95
|
+
create(tenantId: string, req?: any): Promise<void>;
|
|
96
|
+
/**
|
|
97
|
+
* Delete all tenant data (requires confirmation)
|
|
98
|
+
* @param {string} tenantId - Tenant ID
|
|
99
|
+
* @param {Object} options - Options object
|
|
100
|
+
* @param {boolean} options.confirm - Confirmation flag (required)
|
|
101
|
+
* @param {Object} [req] - Request object for org context
|
|
102
|
+
* @returns {Promise<void>}
|
|
103
|
+
*/
|
|
104
|
+
delete(tenantId: string, options: any, req?: any): Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* Disconnect all connections and cleanup
|
|
107
|
+
* @returns {Promise<void>}
|
|
108
|
+
*/
|
|
109
|
+
disconnect(): Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* Get distinct tenant IDs from database
|
|
112
|
+
* @private
|
|
113
|
+
*/
|
|
114
|
+
_getDistinctTenantIds(client: any): Promise<string[]>;
|
|
115
|
+
/**
|
|
116
|
+
* Check if tenant has data
|
|
117
|
+
* @private
|
|
118
|
+
*/
|
|
119
|
+
_tenantHasData(client: any, tenantId: string): Promise<boolean>;
|
|
120
|
+
/**
|
|
121
|
+
* Delete all tenant data
|
|
122
|
+
* @private
|
|
123
|
+
*/
|
|
124
|
+
_deleteAllTenantData(client: any, tenantId: string): Promise<void>;
|
|
125
|
+
/**
|
|
126
|
+
* Clear tenant-specific cached connections
|
|
127
|
+
* @private
|
|
128
|
+
*/
|
|
129
|
+
_clearTenantCache(tenantId: string): void;
|
|
130
|
+
/**
|
|
131
|
+
* Close database connection
|
|
132
|
+
* @private
|
|
133
|
+
*/
|
|
134
|
+
_closeConnection(connection: any): Promise<void>;
|
|
135
|
+
};
|
|
136
|
+
export default databaseClass;
|
|
137
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,UAAU,cAAc;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,UAAU,YAAa,SAAQ,cAAc;IAC3C,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,KAAK,IAAI,CAAC;CAClC;AAED,UAAU,kBAAmB,SAAQ,cAAc;IACjD,EAAE,EAAE,GAAG,CAAC;IACR,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,GAAG,CAAC;IAChE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC;CACjE;AAED,KAAK,mBAAmB,GAAG,YAAY,GAAG,kBAAkB,CAAC;AA2K7D;;GAEG;AACH,cAAM,WAAW;IAEf,OAAO,CAAC,KAAK,CAAS;gBACV,KAAK,EAAE,MAAM;IAIzB;;OAEG;IACG,GAAG,CAAC,GAAG,GAAE,GAAU;IAWzB;;OAEG;IACG,UAAU,CAAC,GAAG,GAAE,GAAU;CAUjC;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;IACxB;;;;OAIG;cACY,GAAG,GAAU,OAAO,CAAC,mBAAmB,CAAC;IAoBxD;;;;OAIG;qBACmB,GAAG,GAAU,OAAO,CAAC,mBAAmB,CAAC;IAgB/D;;;;OAIG;eACQ,MAAM;IAQjB;;;OAGG;cACa,OAAO,CAAC,GAAG,CAAC;IA4B5B;;;;OAIG;eACa,GAAG,GAAU,OAAO,CAAC,MAAM,EAAE,CAAC;IAS9C;;;;;OAKG;qBACoB,MAAM,QAAO,GAAG,GAAU,OAAO,CAAC,OAAO,CAAC;IAWjE;;;;;OAKG;qBACoB,MAAM,QAAO,GAAG,GAAU,OAAO,CAAC,IAAI,CAAC;IAgB9D;;;;;;;OAOG;qBACoB,MAAM,WAAW,GAAG,QAAO,GAAG,GAAU,OAAO,CAAC,IAAI,CAAC;IAkB5E;;;OAGG;kBACiB,OAAO,CAAC,IAAI,CAAC;IAsBjC;;;OAGG;kCACiC,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAsC3D;;;OAGG;2BAC0B,GAAG,YAAY,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA8BrE;;;OAGG;iCACgC,GAAG,YAAY,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCxE;;;OAGG;gCACyB,MAAM,GAAG,IAAI;IAkBzC;;;OAGG;iCACgC,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;CAWvD,CAAC;AAGF,eAAe,aAAa,CAAC"}
|