@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,494 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simplified Prisma adapter with app discovery and tenant middleware
|
|
3
|
+
* @module @bloomneo/appkit/database
|
|
4
|
+
* @file src/database/adapters/prisma.ts
|
|
5
|
+
*
|
|
6
|
+
* @llm-rule WHEN: Using Prisma ORM with PostgreSQL, MySQL, or SQLite databases in VoilaJSX framework
|
|
7
|
+
* @llm-rule AVOID: Using with MongoDB - use mongoose adapter instead
|
|
8
|
+
* @llm-rule NOTE: Auto-discovers apps from /apps directory structure, applies tenant filtering
|
|
9
|
+
*/
|
|
10
|
+
import fs from 'fs';
|
|
11
|
+
import path from 'path';
|
|
12
|
+
import { createDatabaseError } from '../defaults.js';
|
|
13
|
+
/**
|
|
14
|
+
* Simplified Prisma adapter with VoilaJSX app discovery
|
|
15
|
+
*/
|
|
16
|
+
export class PrismaAdapter {
|
|
17
|
+
options;
|
|
18
|
+
clients;
|
|
19
|
+
discoveredApps;
|
|
20
|
+
isDevelopment;
|
|
21
|
+
constructor(options = {}) {
|
|
22
|
+
this.options = options;
|
|
23
|
+
this.clients = new Map();
|
|
24
|
+
this.discoveredApps = null;
|
|
25
|
+
this.isDevelopment = process.env.NODE_ENV === 'development';
|
|
26
|
+
if (this.isDevelopment) {
|
|
27
|
+
console.log('⚡ [AppKit] Prisma adapter initialized with app discovery');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Creates Prisma client with app discovery and automatic connection management
|
|
32
|
+
*/
|
|
33
|
+
async createClient(config) {
|
|
34
|
+
const { url, options = {} } = config;
|
|
35
|
+
const appName = config.appName || await this._detectCurrentApp();
|
|
36
|
+
const clientKey = `${appName}_${url}_${JSON.stringify(options)}`;
|
|
37
|
+
if (!this.clients.has(clientKey)) {
|
|
38
|
+
try {
|
|
39
|
+
// Load app-specific Prisma client
|
|
40
|
+
const PrismaClient = await this._loadPrismaClientForApp(appName);
|
|
41
|
+
// Use original URL directly (don't resolve) to match working direct Prisma client
|
|
42
|
+
if (this.isDevelopment) {
|
|
43
|
+
console.log('🔍 [AppKit DB Debug] Using original URL:', url);
|
|
44
|
+
}
|
|
45
|
+
console.log('🔍 [AppKit DB Debug] Masked URL:', url);
|
|
46
|
+
// Use the exact same config as the working direct Prisma client
|
|
47
|
+
const client = new PrismaClient({
|
|
48
|
+
datasources: {
|
|
49
|
+
db: { url: url },
|
|
50
|
+
},
|
|
51
|
+
log: this.isDevelopment ? ['error', 'warn'] : ['error'],
|
|
52
|
+
...options,
|
|
53
|
+
});
|
|
54
|
+
await client.$connect();
|
|
55
|
+
// Add metadata
|
|
56
|
+
client._appKit = true;
|
|
57
|
+
client._appName = appName;
|
|
58
|
+
client._url = url;
|
|
59
|
+
this.clients.set(clientKey, client);
|
|
60
|
+
if (this.isDevelopment) {
|
|
61
|
+
console.log(`✅ [AppKit] Created Prisma client for app: ${appName}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
throw createDatabaseError(`Failed to create Prisma client for app '${appName}': ${error.message}`, 500);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return this.clients.get(clientKey);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Apply tenant filtering middleware to Prisma client
|
|
72
|
+
*/
|
|
73
|
+
async applyTenantMiddleware(client, tenantId, options = {}) {
|
|
74
|
+
const tenantField = options.fieldName || 'tenant_id';
|
|
75
|
+
// Add tenant middleware for automatic filtering and insertion
|
|
76
|
+
client.$use(async (params, next) => {
|
|
77
|
+
// Add tenant to create operations
|
|
78
|
+
if (params.action === 'create' && params.args?.data) {
|
|
79
|
+
if (!params.args.data[tenantField]) {
|
|
80
|
+
params.args.data[tenantField] = tenantId;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Add tenant to createMany operations
|
|
84
|
+
if (params.action === 'createMany' && params.args?.data) {
|
|
85
|
+
params.args.data = params.args.data.map((item) => ({
|
|
86
|
+
...item,
|
|
87
|
+
[tenantField]: item[tenantField] || tenantId,
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
// Add tenant to upsert operations
|
|
91
|
+
if (params.action === 'upsert') {
|
|
92
|
+
if (params.args?.create && !params.args.create[tenantField]) {
|
|
93
|
+
params.args.create[tenantField] = tenantId;
|
|
94
|
+
}
|
|
95
|
+
if (params.args?.update && !params.args.update[tenantField]) {
|
|
96
|
+
params.args.update[tenantField] = tenantId;
|
|
97
|
+
}
|
|
98
|
+
if (params.args?.where && !params.args.where[tenantField]) {
|
|
99
|
+
params.args.where[tenantField] = tenantId;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Add tenant filter to read/update/delete operations
|
|
103
|
+
const filterActions = [
|
|
104
|
+
'findFirst',
|
|
105
|
+
'findMany',
|
|
106
|
+
'findUnique',
|
|
107
|
+
'update',
|
|
108
|
+
'updateMany',
|
|
109
|
+
'delete',
|
|
110
|
+
'deleteMany',
|
|
111
|
+
'count',
|
|
112
|
+
'aggregate',
|
|
113
|
+
'groupBy',
|
|
114
|
+
];
|
|
115
|
+
if (filterActions.includes(params.action)) {
|
|
116
|
+
if (!params.args)
|
|
117
|
+
params.args = {};
|
|
118
|
+
if (!params.args.where)
|
|
119
|
+
params.args.where = {};
|
|
120
|
+
// Handle complex where clauses
|
|
121
|
+
if (params.args.where.AND) {
|
|
122
|
+
// Check if tenant filter already exists
|
|
123
|
+
const hasTenantFilter = params.args.where.AND.some((condition) => typeof condition === 'object' &&
|
|
124
|
+
condition !== null &&
|
|
125
|
+
condition[tenantField] !== undefined);
|
|
126
|
+
if (!hasTenantFilter) {
|
|
127
|
+
params.args.where.AND.push({ [tenantField]: tenantId });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else if (params.args.where.OR) {
|
|
131
|
+
// Wrap OR in AND with tenant filter
|
|
132
|
+
params.args.where = {
|
|
133
|
+
AND: [{ [tenantField]: tenantId }, { OR: params.args.where.OR }],
|
|
134
|
+
};
|
|
135
|
+
delete params.args.where.OR;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
// Add tenant filter to simple where
|
|
139
|
+
if (params.args.where[tenantField] === undefined) {
|
|
140
|
+
params.args.where[tenantField] = tenantId;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return next(params);
|
|
145
|
+
});
|
|
146
|
+
// Mark as tenant-filtered
|
|
147
|
+
client._tenantId = tenantId;
|
|
148
|
+
client._tenantFiltered = true;
|
|
149
|
+
return client;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Auto-discover VoilaJSX apps with Prisma clients
|
|
153
|
+
*/
|
|
154
|
+
async discoverApps() {
|
|
155
|
+
if (this.discoveredApps)
|
|
156
|
+
return this.discoveredApps;
|
|
157
|
+
// Look for apps directory
|
|
158
|
+
const appsDir = this._findAppsDirectory();
|
|
159
|
+
if (!appsDir) {
|
|
160
|
+
if (this.isDevelopment) {
|
|
161
|
+
console.warn('⚠️ [AppKit] No /apps directory found, using single app mode');
|
|
162
|
+
}
|
|
163
|
+
this.discoveredApps = [];
|
|
164
|
+
return [];
|
|
165
|
+
}
|
|
166
|
+
const apps = [];
|
|
167
|
+
try {
|
|
168
|
+
const appFolders = fs
|
|
169
|
+
.readdirSync(appsDir, { withFileTypes: true })
|
|
170
|
+
.filter((dirent) => dirent.isDirectory())
|
|
171
|
+
.map((dirent) => dirent.name);
|
|
172
|
+
for (const appName of appFolders) {
|
|
173
|
+
// VoilaJSX standard: apps/{appName}/prisma/generated/client
|
|
174
|
+
const clientPath = path.join(appsDir, appName, 'prisma/generated/client/index.js');
|
|
175
|
+
if (fs.existsSync(clientPath)) {
|
|
176
|
+
apps.push({
|
|
177
|
+
name: appName,
|
|
178
|
+
clientPath: path.resolve(clientPath),
|
|
179
|
+
});
|
|
180
|
+
if (this.isDevelopment) {
|
|
181
|
+
console.log(`✅ [AppKit] Found Prisma client for app: ${appName}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
else if (this.isDevelopment) {
|
|
185
|
+
console.log(`⚠️ [AppKit] No Prisma client found for app: ${appName}`);
|
|
186
|
+
console.log(` Expected: ${clientPath}`);
|
|
187
|
+
console.log(` Run: cd apps/${appName} && npx prisma generate`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
this.discoveredApps = apps;
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
console.error('❌ [AppKit] Error discovering apps:', error.message);
|
|
194
|
+
this.discoveredApps = [];
|
|
195
|
+
return [];
|
|
196
|
+
}
|
|
197
|
+
if (this.isDevelopment) {
|
|
198
|
+
console.log(`🔍 [AppKit] Discovered ${apps.length} apps with Prisma clients`);
|
|
199
|
+
}
|
|
200
|
+
return apps;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Check if tenant registry exists (simplified for Prisma)
|
|
204
|
+
*/
|
|
205
|
+
async hasTenantRegistry(client) {
|
|
206
|
+
try {
|
|
207
|
+
// Look for a tenant registry model
|
|
208
|
+
const models = Object.keys(client).filter((key) => !key.startsWith('$') &&
|
|
209
|
+
!key.startsWith('_') &&
|
|
210
|
+
typeof client[key] === 'object' &&
|
|
211
|
+
client[key] !== null &&
|
|
212
|
+
typeof client[key].findFirst === 'function');
|
|
213
|
+
const registryModels = ['tenantRegistry', 'TenantRegistry', 'tenant_registry'];
|
|
214
|
+
return models.some(model => registryModels.includes(model) ||
|
|
215
|
+
(model.toLowerCase().includes('tenant') && model.toLowerCase().includes('registry')));
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Create tenant registry entry
|
|
223
|
+
*/
|
|
224
|
+
async createTenantRegistryEntry(client, tenantId) {
|
|
225
|
+
try {
|
|
226
|
+
const registryModel = this._getTenantRegistryModel(client);
|
|
227
|
+
if (registryModel) {
|
|
228
|
+
await registryModel.upsert({
|
|
229
|
+
where: { tenantId },
|
|
230
|
+
create: {
|
|
231
|
+
tenantId,
|
|
232
|
+
createdAt: new Date(),
|
|
233
|
+
updatedAt: new Date()
|
|
234
|
+
},
|
|
235
|
+
update: { updatedAt: new Date() },
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
if (this.isDevelopment) {
|
|
241
|
+
console.debug('Failed to create tenant registry entry:', error.message);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Delete tenant registry entry
|
|
247
|
+
*/
|
|
248
|
+
async deleteTenantRegistryEntry(client, tenantId) {
|
|
249
|
+
try {
|
|
250
|
+
const registryModel = this._getTenantRegistryModel(client);
|
|
251
|
+
if (registryModel) {
|
|
252
|
+
await registryModel.delete({
|
|
253
|
+
where: { tenantId },
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
if (this.isDevelopment) {
|
|
259
|
+
console.debug('Failed to delete tenant registry entry:', error.message);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Check if tenant exists in registry
|
|
265
|
+
*/
|
|
266
|
+
async tenantExistsInRegistry(client, tenantId) {
|
|
267
|
+
try {
|
|
268
|
+
const registryModel = this._getTenantRegistryModel(client);
|
|
269
|
+
if (registryModel) {
|
|
270
|
+
const entry = await registryModel.findUnique({
|
|
271
|
+
where: { tenantId },
|
|
272
|
+
});
|
|
273
|
+
return !!entry;
|
|
274
|
+
}
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Get all tenants from registry
|
|
283
|
+
*/
|
|
284
|
+
async getTenantsFromRegistry(client) {
|
|
285
|
+
try {
|
|
286
|
+
const registryModel = this._getTenantRegistryModel(client);
|
|
287
|
+
if (registryModel) {
|
|
288
|
+
const entries = await registryModel.findMany({
|
|
289
|
+
select: { tenantId: true },
|
|
290
|
+
orderBy: { tenantId: 'asc' },
|
|
291
|
+
});
|
|
292
|
+
return entries.map((entry) => entry.tenantId);
|
|
293
|
+
}
|
|
294
|
+
return [];
|
|
295
|
+
}
|
|
296
|
+
catch (error) {
|
|
297
|
+
return [];
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Disconnect all cached clients
|
|
302
|
+
*/
|
|
303
|
+
async disconnect() {
|
|
304
|
+
const disconnectPromises = [];
|
|
305
|
+
for (const [key, client] of this.clients) {
|
|
306
|
+
disconnectPromises.push(client
|
|
307
|
+
.$disconnect()
|
|
308
|
+
.catch((error) => console.warn(`Error disconnecting Prisma client ${key}:`, error.message)));
|
|
309
|
+
}
|
|
310
|
+
await Promise.all(disconnectPromises);
|
|
311
|
+
this.clients.clear();
|
|
312
|
+
if (this.isDevelopment) {
|
|
313
|
+
console.log('👋 [AppKit] Prisma adapter disconnected');
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
// Private helper methods
|
|
317
|
+
/**
|
|
318
|
+
* Detect current app from file path (VoilaJSX structure)
|
|
319
|
+
*/
|
|
320
|
+
async _detectCurrentApp() {
|
|
321
|
+
try {
|
|
322
|
+
// Get the calling file from stack trace
|
|
323
|
+
const stack = new Error().stack;
|
|
324
|
+
if (!stack)
|
|
325
|
+
return 'main';
|
|
326
|
+
const stackLines = stack.split('\n');
|
|
327
|
+
// Look for the first file in /apps/ directory
|
|
328
|
+
for (let i = 1; i < Math.min(stackLines.length, 10); i++) {
|
|
329
|
+
const line = stackLines[i];
|
|
330
|
+
if (line.includes('file://') && line.includes('/apps/')) {
|
|
331
|
+
const fileMatch = line.match(/\/apps\/([^\/]+)\//);
|
|
332
|
+
if (fileMatch) {
|
|
333
|
+
return fileMatch[1]; // Return app name
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
// Fallback: check current working directory
|
|
338
|
+
const cwd = process.cwd();
|
|
339
|
+
const appsMatch = cwd.match(/\/apps\/([^\/]+)/);
|
|
340
|
+
if (appsMatch) {
|
|
341
|
+
return appsMatch[1];
|
|
342
|
+
}
|
|
343
|
+
return 'main';
|
|
344
|
+
}
|
|
345
|
+
catch (error) {
|
|
346
|
+
if (this.isDevelopment) {
|
|
347
|
+
console.warn('Failed to detect current app:', error.message);
|
|
348
|
+
}
|
|
349
|
+
return 'main';
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Find apps directory in project structure
|
|
354
|
+
*/
|
|
355
|
+
_findAppsDirectory() {
|
|
356
|
+
// Check environment variable first
|
|
357
|
+
if (process.env.VOILA_APPS_DIR && fs.existsSync(process.env.VOILA_APPS_DIR)) {
|
|
358
|
+
return process.env.VOILA_APPS_DIR;
|
|
359
|
+
}
|
|
360
|
+
// Search upwards from current directory
|
|
361
|
+
let currentDir = process.cwd();
|
|
362
|
+
for (let i = 0; i < 5; i++) {
|
|
363
|
+
const appsPath = path.join(currentDir, 'apps');
|
|
364
|
+
if (fs.existsSync(appsPath)) {
|
|
365
|
+
return appsPath;
|
|
366
|
+
}
|
|
367
|
+
const parentDir = path.dirname(currentDir);
|
|
368
|
+
if (parentDir === currentDir)
|
|
369
|
+
break; // Reached root
|
|
370
|
+
currentDir = parentDir;
|
|
371
|
+
}
|
|
372
|
+
return null;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Load Prisma client for specific app
|
|
376
|
+
*/
|
|
377
|
+
async _loadPrismaClientForApp(appName) {
|
|
378
|
+
// First try discovered apps
|
|
379
|
+
const apps = await this.discoverApps();
|
|
380
|
+
const app = apps.find((a) => a.name === appName);
|
|
381
|
+
if (app) {
|
|
382
|
+
try {
|
|
383
|
+
const module = await import(`file://${app.clientPath}`);
|
|
384
|
+
if (module.PrismaClient) {
|
|
385
|
+
return module.PrismaClient;
|
|
386
|
+
}
|
|
387
|
+
if (module.default?.PrismaClient) {
|
|
388
|
+
return module.default.PrismaClient;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
catch (error) {
|
|
392
|
+
if (this.isDevelopment) {
|
|
393
|
+
console.warn(`Failed to load client for ${appName}:`, error.message);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
// Fallback: try standard paths
|
|
398
|
+
const fallbackPaths = [
|
|
399
|
+
`./apps/${appName}/prisma/generated/client/index.js`,
|
|
400
|
+
`../apps/${appName}/prisma/generated/client/index.js`,
|
|
401
|
+
`../../apps/${appName}/prisma/generated/client/index.js`,
|
|
402
|
+
`./node_modules/@prisma/client/index.js`,
|
|
403
|
+
'@prisma/client', // Global fallback
|
|
404
|
+
];
|
|
405
|
+
for (const clientPath of fallbackPaths) {
|
|
406
|
+
try {
|
|
407
|
+
const module = await import(clientPath);
|
|
408
|
+
if (module.PrismaClient) {
|
|
409
|
+
if (this.isDevelopment) {
|
|
410
|
+
console.log(`✅ [AppKit] Found Prisma client at - ${clientPath}`);
|
|
411
|
+
}
|
|
412
|
+
return module.PrismaClient;
|
|
413
|
+
}
|
|
414
|
+
if (module.default?.PrismaClient) {
|
|
415
|
+
return module.default.PrismaClient;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
catch (error) {
|
|
419
|
+
console.log(`❌ [AppKit] Failed to load Prisma client at: ${clientPath}`);
|
|
420
|
+
continue;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
throw createDatabaseError(`Prisma client not found for app '${appName}'. ` +
|
|
424
|
+
`Run: cd apps/${appName} && npx prisma generate`, 500);
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Get tenant registry model (handles different naming conventions)
|
|
428
|
+
*/
|
|
429
|
+
_getTenantRegistryModel(client) {
|
|
430
|
+
const possibleNames = [
|
|
431
|
+
'tenantRegistry',
|
|
432
|
+
'TenantRegistry',
|
|
433
|
+
'tenant_registry',
|
|
434
|
+
'tenantregistry'
|
|
435
|
+
];
|
|
436
|
+
for (const name of possibleNames) {
|
|
437
|
+
if (client[name] && typeof client[name].findUnique === 'function') {
|
|
438
|
+
return client[name];
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
return null;
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Resolve database URL with fallback paths for SQLite files
|
|
445
|
+
*/
|
|
446
|
+
_resolveDatabaseUrl(url) {
|
|
447
|
+
// Only process file:// URLs (SQLite)
|
|
448
|
+
if (!url.startsWith('file:')) {
|
|
449
|
+
return url;
|
|
450
|
+
}
|
|
451
|
+
// Extract the file path from the URL
|
|
452
|
+
const filePath = url.replace(/^file:/, '');
|
|
453
|
+
// If it's an absolute path, return as-is
|
|
454
|
+
if (path.isAbsolute(filePath)) {
|
|
455
|
+
return url;
|
|
456
|
+
}
|
|
457
|
+
// For relative paths, check multiple locations
|
|
458
|
+
const fallbackPaths = [
|
|
459
|
+
filePath, // Original path (e.g., "dev.db")
|
|
460
|
+
`prisma/${filePath}`, // Check in prisma folder
|
|
461
|
+
`./prisma/${filePath}`, // Check in ./prisma folder
|
|
462
|
+
`data/${filePath}`, // Check in data folder
|
|
463
|
+
];
|
|
464
|
+
for (const testPath of fallbackPaths) {
|
|
465
|
+
const fullPath = path.resolve(process.cwd(), testPath);
|
|
466
|
+
if (fs.existsSync(fullPath)) {
|
|
467
|
+
const resolvedUrl = `file:${testPath}`;
|
|
468
|
+
if (this.isDevelopment) {
|
|
469
|
+
console.log(`📂 [AppKit] Database found at: ${testPath}`);
|
|
470
|
+
}
|
|
471
|
+
return resolvedUrl;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
// If no file found, return original URL (Prisma will create it)
|
|
475
|
+
if (this.isDevelopment) {
|
|
476
|
+
console.log(`📂 [AppKit] Database will be created at: ${filePath}`);
|
|
477
|
+
}
|
|
478
|
+
return url;
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Mask URL for logging (hide credentials)
|
|
482
|
+
*/
|
|
483
|
+
_maskUrl(url) {
|
|
484
|
+
if (!url)
|
|
485
|
+
return '[no-url]';
|
|
486
|
+
try {
|
|
487
|
+
return url.replace(/:\/\/[^@]*@/, '://***:***@');
|
|
488
|
+
}
|
|
489
|
+
catch {
|
|
490
|
+
return '[masked-url]';
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
//# sourceMappingURL=prisma.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma.js","sourceRoot":"","sources":["../../../src/database/adapters/prisma.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
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 declare function validateTenantId(tenantId: string): boolean;
|
|
20
|
+
export declare function validateOrgId(orgId: string): boolean;
|
|
21
|
+
export declare function validateDatabaseUrl(url: string): boolean;
|
|
22
|
+
declare class DatabaseError extends Error {
|
|
23
|
+
statusCode: number;
|
|
24
|
+
details: any;
|
|
25
|
+
constructor(message: string, statusCode?: number, details?: any);
|
|
26
|
+
}
|
|
27
|
+
export declare function createDatabaseError(message: string, statusCode?: number, details?: any): DatabaseError;
|
|
28
|
+
export declare function detectProvider(url: string): string;
|
|
29
|
+
export declare function detectAdapter(url: string): string;
|
|
30
|
+
export declare function sanitizeDatabaseName(name: string): string;
|
|
31
|
+
export declare function getOrgEnvironmentVars(): Record<string, string>;
|
|
32
|
+
export declare function validateEnvironment(): any;
|
|
33
|
+
export declare function getSmartDefaults(): {
|
|
34
|
+
database: {
|
|
35
|
+
url: string;
|
|
36
|
+
provider: string;
|
|
37
|
+
adapter: string;
|
|
38
|
+
};
|
|
39
|
+
tenant: {
|
|
40
|
+
enabled: any;
|
|
41
|
+
mode: string;
|
|
42
|
+
fieldName: string;
|
|
43
|
+
};
|
|
44
|
+
org: {
|
|
45
|
+
enabled: any;
|
|
46
|
+
count: any;
|
|
47
|
+
urls: Record<string, string>;
|
|
48
|
+
};
|
|
49
|
+
environment: {
|
|
50
|
+
isDevelopment: boolean;
|
|
51
|
+
isProduction: boolean;
|
|
52
|
+
nodeEnv: string;
|
|
53
|
+
};
|
|
54
|
+
validation: any;
|
|
55
|
+
};
|
|
56
|
+
export declare function validateSchema(client: any, requiredField?: string): Promise<{
|
|
57
|
+
valid: boolean;
|
|
58
|
+
warnings: string[];
|
|
59
|
+
}>;
|
|
60
|
+
export declare function formatBytes(bytes: number): string;
|
|
61
|
+
export declare function maskUrl(url: string): string;
|
|
62
|
+
export declare function getConfigSummary(): {
|
|
63
|
+
database: {
|
|
64
|
+
provider: string;
|
|
65
|
+
adapter: string;
|
|
66
|
+
url: string;
|
|
67
|
+
};
|
|
68
|
+
tenant: {
|
|
69
|
+
enabled: any;
|
|
70
|
+
mode: string;
|
|
71
|
+
};
|
|
72
|
+
org: {
|
|
73
|
+
enabled: any;
|
|
74
|
+
count: any;
|
|
75
|
+
organizations: string[];
|
|
76
|
+
};
|
|
77
|
+
environment: string;
|
|
78
|
+
validation: {
|
|
79
|
+
valid: any;
|
|
80
|
+
warningCount: any;
|
|
81
|
+
errorCount: any;
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
export declare function getCachedValidation(): any;
|
|
85
|
+
export declare function clearValidationCache(): void;
|
|
86
|
+
export {};
|
|
87
|
+
//# sourceMappingURL=defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/database/defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQxD;AAED,cAAM,aAAc,SAAQ,KAAK;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,GAAG,CAAC;gBAED,OAAO,EAAE,MAAM,EAAE,UAAU,SAAM,EAAE,OAAO,GAAE,GAAU;CAUnE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,SAAM,EAAE,OAAO,GAAE,GAAU,GAAG,aAAa,CAEzG;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOlD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKzD;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAc9D;AAED,wBAAgB,mBAAmB,QA2DlC;AAED,wBAAgB,gBAAgB;;;;;;;;;;;;;;;;;;;;;;EAyC/B;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,aAAa,SAAc,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA+B9H;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO3C;AAED,wBAAgB,gBAAgB;;;;;;;;;;;;;;;;;;;;;EAwB/B;AAID,wBAAgB,mBAAmB,IAAI,GAAG,CAKzC;AAED,wBAAgB,oBAAoB,SAEnC"}
|