@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,480 @@
1
+ /**
2
+ * Simplified Mongoose adapter with app discovery and tenant middleware
3
+ * @module @bloomneo/appkit/database
4
+ * @file src/database/adapters/mongoose.ts
5
+ *
6
+ * @llm-rule WHEN: Using Mongoose ODM with MongoDB databases in VoilaJSX framework
7
+ * @llm-rule AVOID: Using with SQL databases - use prisma 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 Mongoose adapter with VoilaJSX app discovery
15
+ */
16
+ export class MongooseAdapter {
17
+ options;
18
+ connections;
19
+ discoveredApps;
20
+ isDevelopment;
21
+ mongoose;
22
+ constructor(options = {}) {
23
+ this.options = options;
24
+ this.connections = new Map();
25
+ this.discoveredApps = null;
26
+ this.mongoose = null;
27
+ this.isDevelopment = process.env.NODE_ENV === 'development';
28
+ if (this.isDevelopment) {
29
+ console.log('⚡ [AppKit] Mongoose adapter initialized with app discovery');
30
+ }
31
+ }
32
+ /**
33
+ * Creates Mongoose connection with app discovery and automatic connection management
34
+ */
35
+ async createClient(config) {
36
+ if (!this.mongoose) {
37
+ try {
38
+ this.mongoose = (await import('mongoose')).default;
39
+ }
40
+ catch (error) {
41
+ throw createDatabaseError('Mongoose not found. Install with: npm install mongoose', 500);
42
+ }
43
+ }
44
+ const { url, maxPoolSize = 10, timeout = 10000, connectionOptions = {} } = config;
45
+ const appName = config.appName || await this._detectCurrentApp();
46
+ const clientKey = `${appName}_${url}_${maxPoolSize}_${timeout}`;
47
+ if (!this.connections.has(clientKey)) {
48
+ try {
49
+ const connection = await this.mongoose.createConnection(url, {
50
+ useNewUrlParser: true,
51
+ useUnifiedTopology: true,
52
+ maxPoolSize,
53
+ serverSelectionTimeoutMS: timeout,
54
+ bufferCommands: false,
55
+ bufferMaxEntries: 0,
56
+ ...connectionOptions,
57
+ });
58
+ // Setup connection event handlers
59
+ this._setupConnectionEvents(connection, url);
60
+ // Load app-specific models
61
+ await this._loadModelsForApp(connection, appName);
62
+ // Add metadata
63
+ connection._appKit = true;
64
+ connection._appName = appName;
65
+ connection._url = url;
66
+ this.connections.set(clientKey, connection);
67
+ if (this.isDevelopment) {
68
+ console.log(`✅ [AppKit] Created Mongoose connection for app: ${appName}`);
69
+ }
70
+ }
71
+ catch (error) {
72
+ throw createDatabaseError(`Failed to create Mongoose connection for app '${appName}': ${error.message}`, 500);
73
+ }
74
+ }
75
+ return this.connections.get(clientKey);
76
+ }
77
+ /**
78
+ * Apply tenant filtering middleware to Mongoose connection
79
+ */
80
+ async applyTenantMiddleware(connection, tenantId, options = {}) {
81
+ const tenantField = options.fieldName || 'tenant_id';
82
+ // Store original model function
83
+ const originalModel = connection.model.bind(connection);
84
+ // Override model function to add middleware
85
+ connection.model = function (name, schema, collection) {
86
+ if (schema && !schema._tenantMiddlewareApplied) {
87
+ // Mark schema as having middleware applied
88
+ schema._tenantMiddlewareApplied = true;
89
+ // Add tenant field to schema if not exists
90
+ if (!schema.paths[tenantField]) {
91
+ schema.add({
92
+ [tenantField]: {
93
+ type: String,
94
+ required: false,
95
+ index: true,
96
+ },
97
+ });
98
+ }
99
+ // Pre-save middleware - add tenant ID
100
+ schema.pre('save', function () {
101
+ if (!this[tenantField]) {
102
+ this[tenantField] = tenantId;
103
+ }
104
+ });
105
+ // Pre-insertMany middleware - add tenant ID to all documents
106
+ schema.pre('insertMany', function (next, docs) {
107
+ if (Array.isArray(docs)) {
108
+ docs.forEach((doc) => {
109
+ if (!doc[tenantField]) {
110
+ doc[tenantField] = tenantId;
111
+ }
112
+ });
113
+ }
114
+ next();
115
+ });
116
+ // Query middleware - add tenant filter
117
+ const queryMethods = [
118
+ 'find',
119
+ 'findOne',
120
+ 'findOneAndUpdate',
121
+ 'findOneAndDelete',
122
+ 'findOneAndRemove',
123
+ 'count',
124
+ 'countDocuments',
125
+ 'distinct',
126
+ 'estimatedDocumentCount',
127
+ ];
128
+ queryMethods.forEach((method) => {
129
+ schema.pre(method, function () {
130
+ const filter = this.getFilter();
131
+ if (!filter[tenantField]) {
132
+ this.where({ [tenantField]: tenantId });
133
+ }
134
+ });
135
+ });
136
+ // Update middleware - add tenant filter and data
137
+ const updateMethods = ['updateOne', 'updateMany', 'replaceOne'];
138
+ updateMethods.forEach((method) => {
139
+ schema.pre(method, function () {
140
+ const filter = this.getFilter();
141
+ if (!filter[tenantField]) {
142
+ this.where({ [tenantField]: tenantId });
143
+ }
144
+ // Also add tenant ID to update data if not present
145
+ const update = this.getUpdate();
146
+ if (update && typeof update === 'object' && !update[tenantField]) {
147
+ if (update.$set) {
148
+ update.$set[tenantField] = tenantId;
149
+ }
150
+ else {
151
+ update[tenantField] = tenantId;
152
+ }
153
+ }
154
+ });
155
+ });
156
+ // Delete middleware - add tenant filter
157
+ const deleteMethods = ['deleteOne', 'deleteMany', 'remove'];
158
+ deleteMethods.forEach((method) => {
159
+ schema.pre(method, function () {
160
+ const filter = this.getFilter();
161
+ if (!filter[tenantField]) {
162
+ this.where({ [tenantField]: tenantId });
163
+ }
164
+ });
165
+ });
166
+ // Aggregate middleware - add tenant match stage
167
+ schema.pre('aggregate', function () {
168
+ const pipeline = this.pipeline();
169
+ // Check if tenant filter already exists in pipeline
170
+ const hasMatch = pipeline.some((stage) => stage.$match && stage.$match[tenantField]);
171
+ if (!hasMatch) {
172
+ // Add tenant filter as first stage
173
+ pipeline.unshift({ $match: { [tenantField]: tenantId } });
174
+ }
175
+ });
176
+ }
177
+ return originalModel(name, schema, collection);
178
+ };
179
+ // Mark connection as tenant-filtered
180
+ connection._tenantId = tenantId;
181
+ connection._tenantFiltered = true;
182
+ return connection;
183
+ }
184
+ /**
185
+ * Auto-discover VoilaJSX apps with Mongoose models
186
+ */
187
+ async discoverApps() {
188
+ if (this.discoveredApps)
189
+ return this.discoveredApps;
190
+ // Look for apps directory
191
+ const appsDir = this._findAppsDirectory();
192
+ if (!appsDir) {
193
+ if (this.isDevelopment) {
194
+ console.warn('⚠️ [AppKit] No /apps directory found, using single app mode');
195
+ }
196
+ this.discoveredApps = [];
197
+ return [];
198
+ }
199
+ const apps = [];
200
+ try {
201
+ const appFolders = fs
202
+ .readdirSync(appsDir, { withFileTypes: true })
203
+ .filter((dirent) => dirent.isDirectory())
204
+ .map((dirent) => dirent.name);
205
+ for (const appName of appFolders) {
206
+ // VoilaJSX standard: apps/{appName}/models or apps/{appName}/src/models
207
+ const possibleModelPaths = [
208
+ path.join(appsDir, appName, 'models'),
209
+ path.join(appsDir, appName, 'src/models'),
210
+ path.join(appsDir, appName, 'lib/models'),
211
+ ];
212
+ let modelsPath = null;
213
+ for (const modelPath of possibleModelPaths) {
214
+ if (fs.existsSync(modelPath)) {
215
+ modelsPath = modelPath;
216
+ break;
217
+ }
218
+ }
219
+ if (modelsPath) {
220
+ apps.push({
221
+ name: appName,
222
+ modelsPath: path.resolve(modelsPath),
223
+ });
224
+ if (this.isDevelopment) {
225
+ console.log(`✅ [AppKit] Found Mongoose models for app: ${appName}`);
226
+ }
227
+ }
228
+ else if (this.isDevelopment) {
229
+ console.log(`⚠️ [AppKit] No Mongoose models found for app: ${appName}`);
230
+ console.log(` Expected: ${possibleModelPaths.join(' or ')}`);
231
+ }
232
+ }
233
+ this.discoveredApps = apps;
234
+ }
235
+ catch (error) {
236
+ console.error('❌ [AppKit] Error discovering apps:', error.message);
237
+ this.discoveredApps = [];
238
+ return [];
239
+ }
240
+ if (this.isDevelopment) {
241
+ console.log(`🔍 [AppKit] Discovered ${apps.length} apps with Mongoose models`);
242
+ }
243
+ return apps;
244
+ }
245
+ /**
246
+ * Check if tenant registry collection exists
247
+ */
248
+ async hasTenantRegistry(connection) {
249
+ try {
250
+ const collections = await connection.db
251
+ .listCollections({
252
+ name: 'tenant_registry',
253
+ })
254
+ .toArray();
255
+ return collections.length > 0;
256
+ }
257
+ catch (error) {
258
+ return false;
259
+ }
260
+ }
261
+ /**
262
+ * Create tenant registry entry
263
+ */
264
+ async createTenantRegistryEntry(connection, tenantId) {
265
+ try {
266
+ const collection = connection.db.collection('tenant_registry');
267
+ await collection.updateOne({ tenant_id: tenantId }, {
268
+ $set: {
269
+ tenant_id: tenantId,
270
+ created_at: new Date(),
271
+ updated_at: new Date(),
272
+ },
273
+ }, { upsert: true });
274
+ }
275
+ catch (error) {
276
+ if (this.isDevelopment) {
277
+ console.debug('Failed to create tenant registry entry:', error.message);
278
+ }
279
+ }
280
+ }
281
+ /**
282
+ * Delete tenant registry entry
283
+ */
284
+ async deleteTenantRegistryEntry(connection, tenantId) {
285
+ try {
286
+ const collection = connection.db.collection('tenant_registry');
287
+ await collection.deleteOne({ tenant_id: tenantId });
288
+ }
289
+ catch (error) {
290
+ if (this.isDevelopment) {
291
+ console.debug('Failed to delete tenant registry entry:', error.message);
292
+ }
293
+ }
294
+ }
295
+ /**
296
+ * Check if tenant exists in registry
297
+ */
298
+ async tenantExistsInRegistry(connection, tenantId) {
299
+ try {
300
+ const collection = connection.db.collection('tenant_registry');
301
+ const doc = await collection.findOne({ tenant_id: tenantId });
302
+ return !!doc;
303
+ }
304
+ catch (error) {
305
+ return false;
306
+ }
307
+ }
308
+ /**
309
+ * Get all tenants from registry
310
+ */
311
+ async getTenantsFromRegistry(connection) {
312
+ try {
313
+ const collection = connection.db.collection('tenant_registry');
314
+ const docs = await collection
315
+ .find({}, {
316
+ projection: { tenant_id: 1, _id: 0 },
317
+ })
318
+ .sort({ tenant_id: 1 })
319
+ .toArray();
320
+ return docs.map((doc) => doc.tenant_id);
321
+ }
322
+ catch (error) {
323
+ return [];
324
+ }
325
+ }
326
+ /**
327
+ * Disconnect all cached connections
328
+ */
329
+ async disconnect() {
330
+ const disconnectPromises = [];
331
+ for (const [key, connection] of this.connections) {
332
+ disconnectPromises.push(connection
333
+ .close()
334
+ .catch((error) => console.warn(`Error disconnecting Mongoose connection ${key}:`, error.message)));
335
+ }
336
+ await Promise.all(disconnectPromises);
337
+ this.connections.clear();
338
+ if (this.isDevelopment) {
339
+ console.log('👋 [AppKit] Mongoose adapter disconnected');
340
+ }
341
+ }
342
+ // Private helper methods
343
+ /**
344
+ * Detect current app from file path (VoilaJSX structure)
345
+ */
346
+ async _detectCurrentApp() {
347
+ try {
348
+ // Get the calling file from stack trace
349
+ const stack = new Error().stack;
350
+ if (!stack)
351
+ return 'main';
352
+ const stackLines = stack.split('\n');
353
+ // Look for the first file in /apps/ directory
354
+ for (let i = 1; i < Math.min(stackLines.length, 10); i++) {
355
+ const line = stackLines[i];
356
+ if (line.includes('file://') && line.includes('/apps/')) {
357
+ const fileMatch = line.match(/\/apps\/([^\/]+)\//);
358
+ if (fileMatch) {
359
+ return fileMatch[1]; // Return app name
360
+ }
361
+ }
362
+ }
363
+ // Fallback: check current working directory
364
+ const cwd = process.cwd();
365
+ const appsMatch = cwd.match(/\/apps\/([^\/]+)/);
366
+ if (appsMatch) {
367
+ return appsMatch[1];
368
+ }
369
+ return 'main';
370
+ }
371
+ catch (error) {
372
+ if (this.isDevelopment) {
373
+ console.warn('Failed to detect current app:', error.message);
374
+ }
375
+ return 'main';
376
+ }
377
+ }
378
+ /**
379
+ * Find apps directory in project structure
380
+ */
381
+ _findAppsDirectory() {
382
+ // Check environment variable first
383
+ if (process.env.VOILA_APPS_DIR && fs.existsSync(process.env.VOILA_APPS_DIR)) {
384
+ return process.env.VOILA_APPS_DIR;
385
+ }
386
+ // Search upwards from current directory
387
+ let currentDir = process.cwd();
388
+ for (let i = 0; i < 5; i++) {
389
+ const appsPath = path.join(currentDir, 'apps');
390
+ if (fs.existsSync(appsPath)) {
391
+ return appsPath;
392
+ }
393
+ const parentDir = path.dirname(currentDir);
394
+ if (parentDir === currentDir)
395
+ break; // Reached root
396
+ currentDir = parentDir;
397
+ }
398
+ return null;
399
+ }
400
+ /**
401
+ * Load models for specific app
402
+ */
403
+ async _loadModelsForApp(connection, appName) {
404
+ // First try discovered apps
405
+ const apps = await this.discoverApps();
406
+ const app = apps.find((a) => a.name === appName);
407
+ if (app) {
408
+ try {
409
+ // Load all model files from the models directory
410
+ const modelFiles = fs
411
+ .readdirSync(app.modelsPath)
412
+ .filter((file) => file.endsWith('.js') || file.endsWith('.ts'))
413
+ .filter((file) => !file.endsWith('.d.ts'));
414
+ for (const modelFile of modelFiles) {
415
+ try {
416
+ const modelPath = path.join(app.modelsPath, modelFile);
417
+ const module = await import(`file://${modelPath}`);
418
+ // Call model registration function if it exists
419
+ if (typeof module.default === 'function') {
420
+ await module.default(connection);
421
+ }
422
+ else if (typeof module.registerModels === 'function') {
423
+ await module.registerModels(connection);
424
+ }
425
+ }
426
+ catch (error) {
427
+ if (this.isDevelopment) {
428
+ console.warn(`Failed to load model ${modelFile} for app ${appName}:`, error.message);
429
+ }
430
+ }
431
+ }
432
+ if (this.isDevelopment) {
433
+ console.log(`✅ [AppKit] Loaded ${modelFiles.length} models for app: ${appName}`);
434
+ }
435
+ }
436
+ catch (error) {
437
+ if (this.isDevelopment) {
438
+ console.warn(`Failed to load models for app ${appName}:`, error.message);
439
+ }
440
+ }
441
+ }
442
+ }
443
+ /**
444
+ * Setup connection event handlers
445
+ */
446
+ _setupConnectionEvents(connection, url) {
447
+ connection.on('connected', () => {
448
+ if (this.isDevelopment) {
449
+ console.debug(`MongoDB connected: ${this._maskUrl(url)}`);
450
+ }
451
+ });
452
+ connection.on('error', (error) => {
453
+ console.error(`MongoDB connection error: ${error.message}`);
454
+ });
455
+ connection.on('disconnected', () => {
456
+ if (this.isDevelopment) {
457
+ console.debug(`MongoDB disconnected: ${this._maskUrl(url)}`);
458
+ }
459
+ });
460
+ connection.on('reconnected', () => {
461
+ if (this.isDevelopment) {
462
+ console.debug(`MongoDB reconnected: ${this._maskUrl(url)}`);
463
+ }
464
+ });
465
+ }
466
+ /**
467
+ * Mask URL for logging (hide credentials)
468
+ */
469
+ _maskUrl(url) {
470
+ if (!url)
471
+ return '[no-url]';
472
+ try {
473
+ return url.replace(/:\/\/[^@]*@/, '://***:***@');
474
+ }
475
+ catch {
476
+ return '[masked-url]';
477
+ }
478
+ }
479
+ }
480
+ //# sourceMappingURL=mongoose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongoose.js","sourceRoot":"","sources":["../../../src/database/adapters/mongoose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
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
+ interface PrismaClientConfig {
11
+ url: string;
12
+ appName?: string;
13
+ options?: Record<string, any>;
14
+ }
15
+ interface DiscoveredApp {
16
+ name: string;
17
+ clientPath: string;
18
+ }
19
+ interface TenantMiddlewareOptions {
20
+ fieldName?: string;
21
+ orgId?: string;
22
+ }
23
+ interface PrismaClient {
24
+ $connect: () => Promise<void>;
25
+ $disconnect: () => Promise<void>;
26
+ $use: (middleware: any) => void;
27
+ $queryRaw?: any;
28
+ _appKit?: boolean;
29
+ _appName?: string;
30
+ _url?: string;
31
+ _tenantId?: string;
32
+ _tenantFiltered?: boolean;
33
+ [key: string]: any;
34
+ }
35
+ /**
36
+ * Simplified Prisma adapter with VoilaJSX app discovery
37
+ */
38
+ export declare class PrismaAdapter {
39
+ private options;
40
+ private clients;
41
+ private discoveredApps;
42
+ private isDevelopment;
43
+ constructor(options?: Record<string, any>);
44
+ /**
45
+ * Creates Prisma client with app discovery and automatic connection management
46
+ */
47
+ createClient(config: PrismaClientConfig): Promise<PrismaClient>;
48
+ /**
49
+ * Apply tenant filtering middleware to Prisma client
50
+ */
51
+ applyTenantMiddleware(client: PrismaClient, tenantId: string, options?: TenantMiddlewareOptions): Promise<PrismaClient>;
52
+ /**
53
+ * Auto-discover VoilaJSX apps with Prisma clients
54
+ */
55
+ discoverApps(): Promise<DiscoveredApp[]>;
56
+ /**
57
+ * Check if tenant registry exists (simplified for Prisma)
58
+ */
59
+ hasTenantRegistry(client: PrismaClient): Promise<boolean>;
60
+ /**
61
+ * Create tenant registry entry
62
+ */
63
+ createTenantRegistryEntry(client: PrismaClient, tenantId: string): Promise<void>;
64
+ /**
65
+ * Delete tenant registry entry
66
+ */
67
+ deleteTenantRegistryEntry(client: PrismaClient, tenantId: string): Promise<void>;
68
+ /**
69
+ * Check if tenant exists in registry
70
+ */
71
+ tenantExistsInRegistry(client: PrismaClient, tenantId: string): Promise<boolean>;
72
+ /**
73
+ * Get all tenants from registry
74
+ */
75
+ getTenantsFromRegistry(client: PrismaClient): Promise<string[]>;
76
+ /**
77
+ * Disconnect all cached clients
78
+ */
79
+ disconnect(): Promise<void>;
80
+ /**
81
+ * Detect current app from file path (VoilaJSX structure)
82
+ */
83
+ private _detectCurrentApp;
84
+ /**
85
+ * Find apps directory in project structure
86
+ */
87
+ private _findAppsDirectory;
88
+ /**
89
+ * Load Prisma client for specific app
90
+ */
91
+ private _loadPrismaClientForApp;
92
+ /**
93
+ * Get tenant registry model (handles different naming conventions)
94
+ */
95
+ private _getTenantRegistryModel;
96
+ /**
97
+ * Resolve database URL with fallback paths for SQLite files
98
+ */
99
+ private _resolveDatabaseUrl;
100
+ /**
101
+ * Mask URL for logging (hide credentials)
102
+ */
103
+ private _maskUrl;
104
+ }
105
+ export {};
106
+ //# sourceMappingURL=prisma.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma.d.ts","sourceRoot":"","sources":["../../../src/database/adapters/prisma.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,UAAU,kBAAkB;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC/B;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,uBAAuB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,YAAY;IACpB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,EAAE,CAAC,UAAU,EAAE,GAAG,KAAK,IAAI,CAAC;IAChC,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAID;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,aAAa,CAAU;gBAEnB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM;IAW7C;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC;IA+CrE;;OAEG;IACG,qBAAqB,CACzB,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,YAAY,CAAC;IAuFxB;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAsD9C;;OAEG;IACG,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAsB/D;;OAEG;IACG,yBAAyB,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBtF;;OAEG;IACG,yBAAyB,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAetF;;OAEG;IACG,sBAAsB,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAetF;;OAEG;IACG,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAgBrE;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBjC;;OAEG;YACW,iBAAiB;IAmC/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAsB1B;;OAEG;YACW,uBAAuB;IAwDrC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAiB/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAwC3B;;OAEG;IACH,OAAO,CAAC,QAAQ;CAQjB"}