@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,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"}
|