@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.
Files changed (262) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +902 -0
  3. package/bin/appkit.js +71 -0
  4. package/bin/commands/generate.js +1050 -0
  5. package/bin/templates/backend/README.md.template +39 -0
  6. package/bin/templates/backend/api.http.template +0 -0
  7. package/bin/templates/backend/docs/APPKIT_CLI.md +507 -0
  8. package/bin/templates/backend/docs/APPKIT_COMMENTS_GUIDELINES.md +61 -0
  9. package/bin/templates/backend/docs/APPKIT_LLM_GUIDE.md +2539 -0
  10. package/bin/templates/backend/package.json.template +34 -0
  11. package/bin/templates/backend/src/api/features/welcome/welcome.http.template +29 -0
  12. package/bin/templates/backend/src/api/features/welcome/welcome.route.ts.template +36 -0
  13. package/bin/templates/backend/src/api/features/welcome/welcome.service.ts.template +88 -0
  14. package/bin/templates/backend/src/api/features/welcome/welcome.types.ts.template +18 -0
  15. package/bin/templates/backend/src/api/lib/api-router.ts.template +84 -0
  16. package/bin/templates/backend/src/api/server.ts.template +188 -0
  17. package/bin/templates/backend/tsconfig.api.json.template +24 -0
  18. package/bin/templates/backend/tsconfig.json.template +40 -0
  19. package/bin/templates/feature/feature.http.template +63 -0
  20. package/bin/templates/feature/feature.route.ts.template +36 -0
  21. package/bin/templates/feature/feature.service.ts.template +81 -0
  22. package/bin/templates/feature/feature.types.ts.template +23 -0
  23. package/bin/templates/feature-db/feature.http.template +63 -0
  24. package/bin/templates/feature-db/feature.model.ts.template +74 -0
  25. package/bin/templates/feature-db/feature.route.ts.template +58 -0
  26. package/bin/templates/feature-db/feature.service.ts.template +231 -0
  27. package/bin/templates/feature-db/feature.types.ts.template +25 -0
  28. package/bin/templates/feature-db/schema-addition.prisma.template +9 -0
  29. package/bin/templates/feature-db/seeding/README.md.template +57 -0
  30. package/bin/templates/feature-db/seeding/feature.seed.js.template +67 -0
  31. package/bin/templates/feature-user/schema-addition.prisma.template +19 -0
  32. package/bin/templates/feature-user/user.http.template +157 -0
  33. package/bin/templates/feature-user/user.model.ts.template +244 -0
  34. package/bin/templates/feature-user/user.route.ts.template +379 -0
  35. package/bin/templates/feature-user/user.seed.js.template +182 -0
  36. package/bin/templates/feature-user/user.service.ts.template +426 -0
  37. package/bin/templates/feature-user/user.types.ts.template +127 -0
  38. package/dist/auth/auth.d.ts +182 -0
  39. package/dist/auth/auth.d.ts.map +1 -0
  40. package/dist/auth/auth.js +477 -0
  41. package/dist/auth/auth.js.map +1 -0
  42. package/dist/auth/defaults.d.ts +104 -0
  43. package/dist/auth/defaults.d.ts.map +1 -0
  44. package/dist/auth/defaults.js +374 -0
  45. package/dist/auth/defaults.js.map +1 -0
  46. package/dist/auth/index.d.ts +70 -0
  47. package/dist/auth/index.d.ts.map +1 -0
  48. package/dist/auth/index.js +94 -0
  49. package/dist/auth/index.js.map +1 -0
  50. package/dist/cache/cache.d.ts +118 -0
  51. package/dist/cache/cache.d.ts.map +1 -0
  52. package/dist/cache/cache.js +249 -0
  53. package/dist/cache/cache.js.map +1 -0
  54. package/dist/cache/defaults.d.ts +63 -0
  55. package/dist/cache/defaults.d.ts.map +1 -0
  56. package/dist/cache/defaults.js +193 -0
  57. package/dist/cache/defaults.js.map +1 -0
  58. package/dist/cache/index.d.ts +101 -0
  59. package/dist/cache/index.d.ts.map +1 -0
  60. package/dist/cache/index.js +203 -0
  61. package/dist/cache/index.js.map +1 -0
  62. package/dist/cache/strategies/memory.d.ts +138 -0
  63. package/dist/cache/strategies/memory.d.ts.map +1 -0
  64. package/dist/cache/strategies/memory.js +348 -0
  65. package/dist/cache/strategies/memory.js.map +1 -0
  66. package/dist/cache/strategies/redis.d.ts +105 -0
  67. package/dist/cache/strategies/redis.d.ts.map +1 -0
  68. package/dist/cache/strategies/redis.js +318 -0
  69. package/dist/cache/strategies/redis.js.map +1 -0
  70. package/dist/config/config.d.ts +62 -0
  71. package/dist/config/config.d.ts.map +1 -0
  72. package/dist/config/config.js +107 -0
  73. package/dist/config/config.js.map +1 -0
  74. package/dist/config/defaults.d.ts +44 -0
  75. package/dist/config/defaults.d.ts.map +1 -0
  76. package/dist/config/defaults.js +217 -0
  77. package/dist/config/defaults.js.map +1 -0
  78. package/dist/config/index.d.ts +105 -0
  79. package/dist/config/index.d.ts.map +1 -0
  80. package/dist/config/index.js +163 -0
  81. package/dist/config/index.js.map +1 -0
  82. package/dist/database/adapters/mongoose.d.ts +106 -0
  83. package/dist/database/adapters/mongoose.d.ts.map +1 -0
  84. package/dist/database/adapters/mongoose.js +480 -0
  85. package/dist/database/adapters/mongoose.js.map +1 -0
  86. package/dist/database/adapters/prisma.d.ts +106 -0
  87. package/dist/database/adapters/prisma.d.ts.map +1 -0
  88. package/dist/database/adapters/prisma.js +494 -0
  89. package/dist/database/adapters/prisma.js.map +1 -0
  90. package/dist/database/defaults.d.ts +87 -0
  91. package/dist/database/defaults.d.ts.map +1 -0
  92. package/dist/database/defaults.js +271 -0
  93. package/dist/database/defaults.js.map +1 -0
  94. package/dist/database/index.d.ts +137 -0
  95. package/dist/database/index.d.ts.map +1 -0
  96. package/dist/database/index.js +490 -0
  97. package/dist/database/index.js.map +1 -0
  98. package/dist/email/defaults.d.ts +100 -0
  99. package/dist/email/defaults.d.ts.map +1 -0
  100. package/dist/email/defaults.js +400 -0
  101. package/dist/email/defaults.js.map +1 -0
  102. package/dist/email/email.d.ts +139 -0
  103. package/dist/email/email.d.ts.map +1 -0
  104. package/dist/email/email.js +316 -0
  105. package/dist/email/email.js.map +1 -0
  106. package/dist/email/index.d.ts +176 -0
  107. package/dist/email/index.d.ts.map +1 -0
  108. package/dist/email/index.js +251 -0
  109. package/dist/email/index.js.map +1 -0
  110. package/dist/email/strategies/console.d.ts +90 -0
  111. package/dist/email/strategies/console.d.ts.map +1 -0
  112. package/dist/email/strategies/console.js +268 -0
  113. package/dist/email/strategies/console.js.map +1 -0
  114. package/dist/email/strategies/resend.d.ts +84 -0
  115. package/dist/email/strategies/resend.d.ts.map +1 -0
  116. package/dist/email/strategies/resend.js +266 -0
  117. package/dist/email/strategies/resend.js.map +1 -0
  118. package/dist/email/strategies/smtp.d.ts +77 -0
  119. package/dist/email/strategies/smtp.d.ts.map +1 -0
  120. package/dist/email/strategies/smtp.js +286 -0
  121. package/dist/email/strategies/smtp.js.map +1 -0
  122. package/dist/error/defaults.d.ts +40 -0
  123. package/dist/error/defaults.d.ts.map +1 -0
  124. package/dist/error/defaults.js +75 -0
  125. package/dist/error/defaults.js.map +1 -0
  126. package/dist/error/error.d.ts +140 -0
  127. package/dist/error/error.d.ts.map +1 -0
  128. package/dist/error/error.js +200 -0
  129. package/dist/error/error.js.map +1 -0
  130. package/dist/error/index.d.ts +145 -0
  131. package/dist/error/index.d.ts.map +1 -0
  132. package/dist/error/index.js +145 -0
  133. package/dist/error/index.js.map +1 -0
  134. package/dist/event/defaults.d.ts +111 -0
  135. package/dist/event/defaults.d.ts.map +1 -0
  136. package/dist/event/defaults.js +378 -0
  137. package/dist/event/defaults.js.map +1 -0
  138. package/dist/event/event.d.ts +171 -0
  139. package/dist/event/event.d.ts.map +1 -0
  140. package/dist/event/event.js +391 -0
  141. package/dist/event/event.js.map +1 -0
  142. package/dist/event/index.d.ts +173 -0
  143. package/dist/event/index.d.ts.map +1 -0
  144. package/dist/event/index.js +302 -0
  145. package/dist/event/index.js.map +1 -0
  146. package/dist/event/strategies/memory.d.ts +122 -0
  147. package/dist/event/strategies/memory.d.ts.map +1 -0
  148. package/dist/event/strategies/memory.js +331 -0
  149. package/dist/event/strategies/memory.js.map +1 -0
  150. package/dist/event/strategies/redis.d.ts +115 -0
  151. package/dist/event/strategies/redis.d.ts.map +1 -0
  152. package/dist/event/strategies/redis.js +434 -0
  153. package/dist/event/strategies/redis.js.map +1 -0
  154. package/dist/index.d.ts +58 -0
  155. package/dist/index.d.ts.map +1 -0
  156. package/dist/index.js +72 -0
  157. package/dist/index.js.map +1 -0
  158. package/dist/logger/defaults.d.ts +67 -0
  159. package/dist/logger/defaults.d.ts.map +1 -0
  160. package/dist/logger/defaults.js +213 -0
  161. package/dist/logger/defaults.js.map +1 -0
  162. package/dist/logger/index.d.ts +84 -0
  163. package/dist/logger/index.d.ts.map +1 -0
  164. package/dist/logger/index.js +101 -0
  165. package/dist/logger/index.js.map +1 -0
  166. package/dist/logger/logger.d.ts +165 -0
  167. package/dist/logger/logger.d.ts.map +1 -0
  168. package/dist/logger/logger.js +843 -0
  169. package/dist/logger/logger.js.map +1 -0
  170. package/dist/logger/transports/console.d.ts +102 -0
  171. package/dist/logger/transports/console.d.ts.map +1 -0
  172. package/dist/logger/transports/console.js +276 -0
  173. package/dist/logger/transports/console.js.map +1 -0
  174. package/dist/logger/transports/database.d.ts +153 -0
  175. package/dist/logger/transports/database.d.ts.map +1 -0
  176. package/dist/logger/transports/database.js +539 -0
  177. package/dist/logger/transports/database.js.map +1 -0
  178. package/dist/logger/transports/file.d.ts +146 -0
  179. package/dist/logger/transports/file.d.ts.map +1 -0
  180. package/dist/logger/transports/file.js +464 -0
  181. package/dist/logger/transports/file.js.map +1 -0
  182. package/dist/logger/transports/http.d.ts +128 -0
  183. package/dist/logger/transports/http.d.ts.map +1 -0
  184. package/dist/logger/transports/http.js +401 -0
  185. package/dist/logger/transports/http.js.map +1 -0
  186. package/dist/logger/transports/webhook.d.ts +152 -0
  187. package/dist/logger/transports/webhook.d.ts.map +1 -0
  188. package/dist/logger/transports/webhook.js +485 -0
  189. package/dist/logger/transports/webhook.js.map +1 -0
  190. package/dist/queue/defaults.d.ts +66 -0
  191. package/dist/queue/defaults.d.ts.map +1 -0
  192. package/dist/queue/defaults.js +205 -0
  193. package/dist/queue/defaults.js.map +1 -0
  194. package/dist/queue/index.d.ts +124 -0
  195. package/dist/queue/index.d.ts.map +1 -0
  196. package/dist/queue/index.js +116 -0
  197. package/dist/queue/index.js.map +1 -0
  198. package/dist/queue/queue.d.ts +156 -0
  199. package/dist/queue/queue.d.ts.map +1 -0
  200. package/dist/queue/queue.js +387 -0
  201. package/dist/queue/queue.js.map +1 -0
  202. package/dist/queue/transports/database.d.ts +165 -0
  203. package/dist/queue/transports/database.d.ts.map +1 -0
  204. package/dist/queue/transports/database.js +595 -0
  205. package/dist/queue/transports/database.js.map +1 -0
  206. package/dist/queue/transports/memory.d.ts +143 -0
  207. package/dist/queue/transports/memory.d.ts.map +1 -0
  208. package/dist/queue/transports/memory.js +415 -0
  209. package/dist/queue/transports/memory.js.map +1 -0
  210. package/dist/queue/transports/redis.d.ts +203 -0
  211. package/dist/queue/transports/redis.d.ts.map +1 -0
  212. package/dist/queue/transports/redis.js +744 -0
  213. package/dist/queue/transports/redis.js.map +1 -0
  214. package/dist/security/defaults.d.ts +64 -0
  215. package/dist/security/defaults.d.ts.map +1 -0
  216. package/dist/security/defaults.js +159 -0
  217. package/dist/security/defaults.js.map +1 -0
  218. package/dist/security/index.d.ts +110 -0
  219. package/dist/security/index.d.ts.map +1 -0
  220. package/dist/security/index.js +160 -0
  221. package/dist/security/index.js.map +1 -0
  222. package/dist/security/security.d.ts +138 -0
  223. package/dist/security/security.d.ts.map +1 -0
  224. package/dist/security/security.js +419 -0
  225. package/dist/security/security.js.map +1 -0
  226. package/dist/storage/defaults.d.ts +79 -0
  227. package/dist/storage/defaults.d.ts.map +1 -0
  228. package/dist/storage/defaults.js +358 -0
  229. package/dist/storage/defaults.js.map +1 -0
  230. package/dist/storage/index.d.ts +153 -0
  231. package/dist/storage/index.d.ts.map +1 -0
  232. package/dist/storage/index.js +242 -0
  233. package/dist/storage/index.js.map +1 -0
  234. package/dist/storage/storage.d.ts +151 -0
  235. package/dist/storage/storage.d.ts.map +1 -0
  236. package/dist/storage/storage.js +439 -0
  237. package/dist/storage/storage.js.map +1 -0
  238. package/dist/storage/strategies/local.d.ts +117 -0
  239. package/dist/storage/strategies/local.d.ts.map +1 -0
  240. package/dist/storage/strategies/local.js +368 -0
  241. package/dist/storage/strategies/local.js.map +1 -0
  242. package/dist/storage/strategies/r2.d.ts +130 -0
  243. package/dist/storage/strategies/r2.d.ts.map +1 -0
  244. package/dist/storage/strategies/r2.js +470 -0
  245. package/dist/storage/strategies/r2.js.map +1 -0
  246. package/dist/storage/strategies/s3.d.ts +121 -0
  247. package/dist/storage/strategies/s3.d.ts.map +1 -0
  248. package/dist/storage/strategies/s3.js +461 -0
  249. package/dist/storage/strategies/s3.js.map +1 -0
  250. package/dist/util/defaults.d.ts +77 -0
  251. package/dist/util/defaults.d.ts.map +1 -0
  252. package/dist/util/defaults.js +193 -0
  253. package/dist/util/defaults.js.map +1 -0
  254. package/dist/util/index.d.ts +97 -0
  255. package/dist/util/index.d.ts.map +1 -0
  256. package/dist/util/index.js +165 -0
  257. package/dist/util/index.js.map +1 -0
  258. package/dist/util/util.d.ts +145 -0
  259. package/dist/util/util.d.ts.map +1 -0
  260. package/dist/util/util.js +481 -0
  261. package/dist/util/util.js.map +1 -0
  262. 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"}