@edgebasejs/react-native 0.1.8 → 0.1.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/README.md +18 -0
- package/dist/client-core/src/index.d.ts +4 -0
- package/dist/client-core/src/index.d.ts.map +1 -1
- package/dist/client-core/src/index.js +4 -0
- package/dist/client-core/src/index.js.map +1 -1
- package/dist/client-core/src/mutations/batch-processor-client.d.ts +67 -0
- package/dist/client-core/src/mutations/batch-processor-client.d.ts.map +1 -0
- package/dist/client-core/src/mutations/batch-processor-client.js +64 -0
- package/dist/client-core/src/mutations/batch-processor-client.js.map +1 -0
- package/dist/client-core/src/mutations/transaction-hook.d.ts +80 -0
- package/dist/client-core/src/mutations/transaction-hook.d.ts.map +1 -0
- package/dist/client-core/src/mutations/transaction-hook.js +204 -0
- package/dist/client-core/src/mutations/transaction-hook.js.map +1 -0
- package/dist/client-core/src/realtime/realtime-sync-manager.d.ts +55 -0
- package/dist/client-core/src/realtime/realtime-sync-manager.d.ts.map +1 -0
- package/dist/client-core/src/realtime/realtime-sync-manager.js +208 -0
- package/dist/client-core/src/realtime/realtime-sync-manager.js.map +1 -0
- package/dist/client-core/src/realtime/subscription-handler.d.ts +74 -0
- package/dist/client-core/src/realtime/subscription-handler.d.ts.map +1 -0
- package/dist/client-core/src/realtime/subscription-handler.js +224 -0
- package/dist/client-core/src/realtime/subscription-handler.js.map +1 -0
- package/dist/client-core/src/sync/sync-engine.d.ts +10 -0
- package/dist/client-core/src/sync/sync-engine.d.ts.map +1 -1
- package/dist/client-core/src/sync/sync-engine.js +37 -5
- package/dist/client-core/src/sync/sync-engine.js.map +1 -1
- package/dist/client-react-native/src/hooks/index.d.ts +10 -0
- package/dist/client-react-native/src/hooks/index.d.ts.map +1 -1
- package/dist/client-react-native/src/hooks/index.js +8 -0
- package/dist/client-react-native/src/hooks/index.js.map +1 -1
- package/dist/client-react-native/src/hooks/use-audit.d.ts +65 -0
- package/dist/client-react-native/src/hooks/use-audit.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-audit.js +201 -0
- package/dist/client-react-native/src/hooks/use-audit.js.map +1 -0
- package/dist/client-react-native/src/hooks/use-batch-mutation.d.ts +56 -0
- package/dist/client-react-native/src/hooks/use-batch-mutation.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-batch-mutation.js +95 -0
- package/dist/client-react-native/src/hooks/use-batch-mutation.js.map +1 -0
- package/dist/client-react-native/src/hooks/use-encryption.d.ts +45 -0
- package/dist/client-react-native/src/hooks/use-encryption.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-encryption.js +143 -0
- package/dist/client-react-native/src/hooks/use-encryption.js.map +1 -0
- package/dist/client-react-native/src/hooks/use-file-manager.d.ts +38 -0
- package/dist/client-react-native/src/hooks/use-file-manager.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-file-manager.js +174 -0
- package/dist/client-react-native/src/hooks/use-file-manager.js.map +1 -0
- package/dist/client-react-native/src/hooks/use-file-upload.d.ts +34 -0
- package/dist/client-react-native/src/hooks/use-file-upload.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-file-upload.js +85 -0
- package/dist/client-react-native/src/hooks/use-file-upload.js.map +1 -0
- package/dist/client-react-native/src/hooks/use-mutation.d.ts.map +1 -1
- package/dist/client-react-native/src/hooks/use-mutation.js +34 -6
- package/dist/client-react-native/src/hooks/use-mutation.js.map +1 -1
- package/dist/client-react-native/src/hooks/use-search.d.ts +33 -0
- package/dist/client-react-native/src/hooks/use-search.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-search.js +174 -0
- package/dist/client-react-native/src/hooks/use-search.js.map +1 -0
- package/dist/client-react-native/src/hooks/use-subscribe.d.ts +14 -0
- package/dist/client-react-native/src/hooks/use-subscribe.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-subscribe.js +165 -0
- package/dist/client-react-native/src/hooks/use-subscribe.js.map +1 -0
- package/dist/client-react-native/src/hooks/use-transaction.d.ts +27 -0
- package/dist/client-react-native/src/hooks/use-transaction.d.ts.map +1 -0
- package/dist/client-react-native/src/hooks/use-transaction.js +160 -0
- package/dist/client-react-native/src/hooks/use-transaction.js.map +1 -0
- package/dist/client-react-native/src/provider.d.ts +5 -2
- package/dist/client-react-native/src/provider.d.ts.map +1 -1
- package/dist/client-react-native/src/provider.js +23 -23
- package/dist/client-react-native/src/provider.js.map +1 -1
- package/dist/core/src/access-rules/column-security.d.ts +80 -0
- package/dist/core/src/access-rules/column-security.d.ts.map +1 -0
- package/dist/core/src/access-rules/column-security.js +191 -0
- package/dist/core/src/access-rules/column-security.js.map +1 -0
- package/dist/core/src/access-rules/engine.d.ts +26 -0
- package/dist/core/src/access-rules/engine.d.ts.map +1 -0
- package/dist/core/src/access-rules/engine.js +76 -0
- package/dist/core/src/access-rules/engine.js.map +1 -0
- package/dist/core/src/access-rules/index.d.ts +3 -0
- package/dist/core/src/access-rules/index.d.ts.map +1 -0
- package/dist/core/src/access-rules/index.js +3 -0
- package/dist/core/src/access-rules/index.js.map +1 -0
- package/dist/core/src/audit/audit-manager.d.ts +108 -0
- package/dist/core/src/audit/audit-manager.d.ts.map +1 -0
- package/dist/core/src/audit/audit-manager.js +265 -0
- package/dist/core/src/audit/audit-manager.js.map +1 -0
- package/dist/core/src/auth/auth-service.d.ts +71 -0
- package/dist/core/src/auth/auth-service.d.ts.map +1 -0
- package/dist/core/src/auth/auth-service.js +177 -0
- package/dist/core/src/auth/auth-service.js.map +1 -0
- package/dist/core/src/auth/index.d.ts +4 -0
- package/dist/core/src/auth/index.d.ts.map +1 -0
- package/dist/core/src/auth/index.js +4 -0
- package/dist/core/src/auth/index.js.map +1 -0
- package/dist/core/src/encryption/encryption-manager.d.ts +97 -0
- package/dist/core/src/encryption/encryption-manager.d.ts.map +1 -0
- package/dist/core/src/encryption/encryption-manager.js +224 -0
- package/dist/core/src/encryption/encryption-manager.js.map +1 -0
- package/dist/core/src/index.d.ts +16 -0
- package/dist/core/src/index.d.ts.map +1 -0
- package/dist/core/src/index.js +16 -0
- package/dist/core/src/index.js.map +1 -0
- package/dist/core/src/realtime/change-notifier.d.ts +50 -0
- package/dist/core/src/realtime/change-notifier.d.ts.map +1 -0
- package/dist/core/src/realtime/change-notifier.js +145 -0
- package/dist/core/src/realtime/change-notifier.js.map +1 -0
- package/dist/core/src/realtime/message-types.d.ts +39 -0
- package/dist/core/src/realtime/message-types.d.ts.map +1 -0
- package/dist/core/src/realtime/message-types.js +5 -0
- package/dist/core/src/realtime/message-types.js.map +1 -0
- package/dist/core/src/realtime/subscription-manager.d.ts +67 -0
- package/dist/core/src/realtime/subscription-manager.d.ts.map +1 -0
- package/dist/core/src/realtime/subscription-manager.js +229 -0
- package/dist/core/src/realtime/subscription-manager.js.map +1 -0
- package/dist/core/src/search/search-manager.d.ts +93 -0
- package/dist/core/src/search/search-manager.d.ts.map +1 -0
- package/dist/core/src/search/search-manager.js +258 -0
- package/dist/core/src/search/search-manager.js.map +1 -0
- package/dist/core/src/storage/file-manager.d.ts +138 -0
- package/dist/core/src/storage/file-manager.d.ts.map +1 -0
- package/dist/core/src/storage/file-manager.js +224 -0
- package/dist/core/src/storage/file-manager.js.map +1 -0
- package/dist/core/src/sync/batch-processor.d.ts +97 -0
- package/dist/core/src/sync/batch-processor.d.ts.map +1 -0
- package/dist/core/src/sync/batch-processor.js +313 -0
- package/dist/core/src/sync/batch-processor.js.map +1 -0
- package/dist/core/src/sync/csv-processor.d.ts +66 -0
- package/dist/core/src/sync/csv-processor.d.ts.map +1 -0
- package/dist/core/src/sync/csv-processor.js +223 -0
- package/dist/core/src/sync/csv-processor.js.map +1 -0
- package/dist/core/src/sync/index.d.ts +3 -0
- package/dist/core/src/sync/index.d.ts.map +1 -0
- package/dist/core/src/sync/index.js +3 -0
- package/dist/core/src/sync/index.js.map +1 -0
- package/dist/core/src/sync/sync-engine.d.ts +68 -0
- package/dist/core/src/sync/sync-engine.d.ts.map +1 -0
- package/dist/core/src/sync/sync-engine.js +317 -0
- package/dist/core/src/sync/sync-engine.js.map +1 -0
- package/dist/core/src/sync/transaction-manager.d.ts +83 -0
- package/dist/core/src/sync/transaction-manager.d.ts.map +1 -0
- package/dist/core/src/sync/transaction-manager.js +227 -0
- package/dist/core/src/sync/transaction-manager.js.map +1 -0
- package/dist/core/src/webhooks/webhook-manager.d.ts +137 -0
- package/dist/core/src/webhooks/webhook-manager.d.ts.map +1 -0
- package/dist/core/src/webhooks/webhook-manager.js +334 -0
- package/dist/core/src/webhooks/webhook-manager.js.map +1 -0
- package/package.json +4 -6
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit trail manager for change tracking and compliance
|
|
3
|
+
* Tracks all data changes with user attribution and timestamps
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Audit manager for tracking data changes
|
|
7
|
+
*/
|
|
8
|
+
export class AuditManager {
|
|
9
|
+
constructor(db, options) {
|
|
10
|
+
this.db = db;
|
|
11
|
+
this.options = {
|
|
12
|
+
trackBefore: options?.trackBefore !== false,
|
|
13
|
+
trackAfter: options?.trackAfter !== false,
|
|
14
|
+
trackChanges: options?.trackChanges !== false,
|
|
15
|
+
excludeFields: options?.excludeFields || ['password', 'password_hash', 'secret', 'token'],
|
|
16
|
+
maxRetentionDays: options?.maxRetentionDays || 90,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Log a data change
|
|
21
|
+
*/
|
|
22
|
+
async logChange(user, entity, recordId, operation, before, after, metadata) {
|
|
23
|
+
const now = Date.now();
|
|
24
|
+
const auditId = `aud_${now}_${Math.random().toString(36).substring(2, 15)}`;
|
|
25
|
+
// Filter sensitive fields
|
|
26
|
+
const filteredBefore = before ? this.filterSensitiveFields(before) : undefined;
|
|
27
|
+
const filteredAfter = after ? this.filterSensitiveFields(after) : undefined;
|
|
28
|
+
// Calculate field-level changes for updates
|
|
29
|
+
let changes;
|
|
30
|
+
if (this.options.trackChanges && operation === 'update' && filteredBefore && filteredAfter) {
|
|
31
|
+
changes = this.calculateChanges(filteredBefore, filteredAfter);
|
|
32
|
+
}
|
|
33
|
+
const auditLog = {
|
|
34
|
+
id: auditId,
|
|
35
|
+
userId: user.id,
|
|
36
|
+
entity,
|
|
37
|
+
recordId,
|
|
38
|
+
operation,
|
|
39
|
+
before: this.options.trackBefore && (operation === 'update' || operation === 'delete') ? filteredBefore : undefined,
|
|
40
|
+
after: this.options.trackAfter && (operation === 'create' || operation === 'update') ? filteredAfter : undefined,
|
|
41
|
+
changes,
|
|
42
|
+
metadata,
|
|
43
|
+
createdAt: now,
|
|
44
|
+
};
|
|
45
|
+
// Store in database
|
|
46
|
+
await this.db.run(`INSERT INTO audit_logs (id, user_id, entity, record_id, operation, before_data, after_data, changes, metadata, created_at)
|
|
47
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
48
|
+
auditLog.id,
|
|
49
|
+
auditLog.userId,
|
|
50
|
+
auditLog.entity,
|
|
51
|
+
auditLog.recordId,
|
|
52
|
+
auditLog.operation,
|
|
53
|
+
auditLog.before ? JSON.stringify(auditLog.before) : null,
|
|
54
|
+
auditLog.after ? JSON.stringify(auditLog.after) : null,
|
|
55
|
+
auditLog.changes ? JSON.stringify(auditLog.changes) : null,
|
|
56
|
+
auditLog.metadata ? JSON.stringify(auditLog.metadata) : null,
|
|
57
|
+
auditLog.createdAt,
|
|
58
|
+
]);
|
|
59
|
+
return auditLog;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Query audit logs
|
|
63
|
+
*/
|
|
64
|
+
async queryLogs(query) {
|
|
65
|
+
const limit = query.limit || 50;
|
|
66
|
+
const offset = query.offset || 0;
|
|
67
|
+
// Build WHERE clause
|
|
68
|
+
const conditions = [];
|
|
69
|
+
const params = [];
|
|
70
|
+
if (query.entity) {
|
|
71
|
+
conditions.push('entity = ?');
|
|
72
|
+
params.push(query.entity);
|
|
73
|
+
}
|
|
74
|
+
if (query.recordId) {
|
|
75
|
+
conditions.push('record_id = ?');
|
|
76
|
+
params.push(query.recordId);
|
|
77
|
+
}
|
|
78
|
+
if (query.userId) {
|
|
79
|
+
conditions.push('user_id = ?');
|
|
80
|
+
params.push(query.userId);
|
|
81
|
+
}
|
|
82
|
+
if (query.operation) {
|
|
83
|
+
conditions.push('operation = ?');
|
|
84
|
+
params.push(query.operation);
|
|
85
|
+
}
|
|
86
|
+
if (query.startDate) {
|
|
87
|
+
conditions.push('created_at >= ?');
|
|
88
|
+
params.push(query.startDate);
|
|
89
|
+
}
|
|
90
|
+
if (query.endDate) {
|
|
91
|
+
conditions.push('created_at <= ?');
|
|
92
|
+
params.push(query.endDate);
|
|
93
|
+
}
|
|
94
|
+
const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
95
|
+
// Get logs
|
|
96
|
+
const sql = `
|
|
97
|
+
SELECT * FROM audit_logs
|
|
98
|
+
${whereClause}
|
|
99
|
+
ORDER BY created_at DESC
|
|
100
|
+
LIMIT ? OFFSET ?
|
|
101
|
+
`;
|
|
102
|
+
const rows = await this.db.getAll(sql, [...params, limit + 1, offset]);
|
|
103
|
+
// Check if there are more results
|
|
104
|
+
const hasMore = rows.length > limit;
|
|
105
|
+
const trimmedRows = hasMore ? rows.slice(0, limit) : rows;
|
|
106
|
+
// Get total count
|
|
107
|
+
const countSql = `SELECT COUNT(*) as total FROM audit_logs ${whereClause}`;
|
|
108
|
+
const countResult = await this.db.getOne(countSql, params);
|
|
109
|
+
const total = countResult?.total || 0;
|
|
110
|
+
// Parse JSON fields
|
|
111
|
+
const logs = trimmedRows.map((row) => ({
|
|
112
|
+
id: row.id,
|
|
113
|
+
userId: row.user_id,
|
|
114
|
+
entity: row.entity,
|
|
115
|
+
recordId: row.record_id,
|
|
116
|
+
operation: row.operation,
|
|
117
|
+
before: row.before_data ? JSON.parse(row.before_data) : undefined,
|
|
118
|
+
after: row.after_data ? JSON.parse(row.after_data) : undefined,
|
|
119
|
+
changes: row.changes ? JSON.parse(row.changes) : undefined,
|
|
120
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
121
|
+
createdAt: row.created_at,
|
|
122
|
+
}));
|
|
123
|
+
return {
|
|
124
|
+
logs,
|
|
125
|
+
total,
|
|
126
|
+
hasMore,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Get audit log by ID
|
|
131
|
+
*/
|
|
132
|
+
async getLog(auditId) {
|
|
133
|
+
const row = await this.db.getOne('SELECT * FROM audit_logs WHERE id = ?', [auditId]);
|
|
134
|
+
if (!row) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
id: row.id,
|
|
139
|
+
userId: row.user_id,
|
|
140
|
+
entity: row.entity,
|
|
141
|
+
recordId: row.record_id,
|
|
142
|
+
operation: row.operation,
|
|
143
|
+
before: row.before_data ? JSON.parse(row.before_data) : undefined,
|
|
144
|
+
after: row.after_data ? JSON.parse(row.after_data) : undefined,
|
|
145
|
+
changes: row.changes ? JSON.parse(row.changes) : undefined,
|
|
146
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
147
|
+
createdAt: row.created_at,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get audit history for a specific record
|
|
152
|
+
*/
|
|
153
|
+
async getRecordHistory(entity, recordId) {
|
|
154
|
+
const rows = await this.db.getAll('SELECT * FROM audit_logs WHERE entity = ? AND record_id = ? ORDER BY created_at DESC', [entity, recordId]);
|
|
155
|
+
return rows.map((row) => ({
|
|
156
|
+
id: row.id,
|
|
157
|
+
userId: row.user_id,
|
|
158
|
+
entity: row.entity,
|
|
159
|
+
recordId: row.record_id,
|
|
160
|
+
operation: row.operation,
|
|
161
|
+
before: row.before_data ? JSON.parse(row.before_data) : undefined,
|
|
162
|
+
after: row.after_data ? JSON.parse(row.after_data) : undefined,
|
|
163
|
+
changes: row.changes ? JSON.parse(row.changes) : undefined,
|
|
164
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
165
|
+
createdAt: row.created_at,
|
|
166
|
+
}));
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Get summary statistics for audit logs
|
|
170
|
+
*/
|
|
171
|
+
async getStatistics(options) {
|
|
172
|
+
const conditions = [];
|
|
173
|
+
const params = [];
|
|
174
|
+
if (options?.entity) {
|
|
175
|
+
conditions.push('entity = ?');
|
|
176
|
+
params.push(options.entity);
|
|
177
|
+
}
|
|
178
|
+
if (options?.userId) {
|
|
179
|
+
conditions.push('user_id = ?');
|
|
180
|
+
params.push(options.userId);
|
|
181
|
+
}
|
|
182
|
+
if (options?.startDate) {
|
|
183
|
+
conditions.push('created_at >= ?');
|
|
184
|
+
params.push(options.startDate);
|
|
185
|
+
}
|
|
186
|
+
if (options?.endDate) {
|
|
187
|
+
conditions.push('created_at <= ?');
|
|
188
|
+
params.push(options.endDate);
|
|
189
|
+
}
|
|
190
|
+
const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
191
|
+
// Total changes
|
|
192
|
+
const totalResult = await this.db.getOne(`SELECT COUNT(*) as total FROM audit_logs ${whereClause}`, params);
|
|
193
|
+
const totalChanges = totalResult?.total || 0;
|
|
194
|
+
// Changes by operation
|
|
195
|
+
const operationRows = await this.db.getAll(`SELECT operation, COUNT(*) as count FROM audit_logs ${whereClause} GROUP BY operation`, params);
|
|
196
|
+
const changesByOperation = operationRows.map((row) => ({
|
|
197
|
+
operation: row.operation,
|
|
198
|
+
count: row.count,
|
|
199
|
+
}));
|
|
200
|
+
// Changes by entity
|
|
201
|
+
const entityRows = await this.db.getAll(`SELECT entity, COUNT(*) as count FROM audit_logs ${whereClause} GROUP BY entity ORDER BY count DESC LIMIT 10`, params);
|
|
202
|
+
const changesByEntity = entityRows.map((row) => ({
|
|
203
|
+
entity: row.entity,
|
|
204
|
+
count: row.count,
|
|
205
|
+
}));
|
|
206
|
+
// Changes by user
|
|
207
|
+
const userRows = await this.db.getAll(`SELECT user_id, COUNT(*) as count FROM audit_logs ${whereClause} GROUP BY user_id ORDER BY count DESC LIMIT 10`, params);
|
|
208
|
+
const changesByUser = userRows.map((row) => ({
|
|
209
|
+
userId: row.user_id,
|
|
210
|
+
count: row.count,
|
|
211
|
+
}));
|
|
212
|
+
return {
|
|
213
|
+
totalChanges,
|
|
214
|
+
changesByOperation,
|
|
215
|
+
changesByEntity,
|
|
216
|
+
changesByUser,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Clean up old audit logs based on retention policy
|
|
221
|
+
*/
|
|
222
|
+
async cleanupOldLogs() {
|
|
223
|
+
const cutoffDate = Date.now() - this.options.maxRetentionDays * 24 * 60 * 60 * 1000;
|
|
224
|
+
const result = await this.db.getOne('SELECT COUNT(*) as count FROM audit_logs WHERE created_at < ?', [cutoffDate]);
|
|
225
|
+
const count = result?.count || 0;
|
|
226
|
+
if (count > 0) {
|
|
227
|
+
await this.db.run('DELETE FROM audit_logs WHERE created_at < ?', [cutoffDate]);
|
|
228
|
+
}
|
|
229
|
+
return count;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Filter sensitive fields from data
|
|
233
|
+
*/
|
|
234
|
+
filterSensitiveFields(data) {
|
|
235
|
+
const filtered = {};
|
|
236
|
+
for (const [key, value] of Object.entries(data)) {
|
|
237
|
+
if (!this.options.excludeFields.includes(key.toLowerCase())) {
|
|
238
|
+
filtered[key] = value;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return filtered;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Calculate field-level changes between before and after states
|
|
245
|
+
*/
|
|
246
|
+
calculateChanges(before, after) {
|
|
247
|
+
const changes = [];
|
|
248
|
+
// Check for changed and new fields
|
|
249
|
+
for (const [field, afterValue] of Object.entries(after)) {
|
|
250
|
+
const beforeValue = before[field];
|
|
251
|
+
// Compare values (handle different types)
|
|
252
|
+
if (JSON.stringify(beforeValue) !== JSON.stringify(afterValue)) {
|
|
253
|
+
changes.push({ field, before: beforeValue, after: afterValue });
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// Check for deleted fields
|
|
257
|
+
for (const field of Object.keys(before)) {
|
|
258
|
+
if (!(field in after)) {
|
|
259
|
+
changes.push({ field, before: before[field], after: undefined });
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return changes;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=audit-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit-manager.js","sourceRoot":"","sources":["../../../../../core/src/audit/audit-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { User, AuthTokens, LoginRequest, RegisterRequest } from '@edgebasejs/types';
|
|
3
|
+
export declare const LoginSchema: z.ZodObject<{
|
|
4
|
+
email: z.ZodString;
|
|
5
|
+
password: z.ZodString;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
email: string;
|
|
8
|
+
password: string;
|
|
9
|
+
}, {
|
|
10
|
+
email: string;
|
|
11
|
+
password: string;
|
|
12
|
+
}>;
|
|
13
|
+
export declare const RegisterSchema: z.ZodObject<{
|
|
14
|
+
email: z.ZodString;
|
|
15
|
+
password: z.ZodString;
|
|
16
|
+
}, "strip", z.ZodTypeAny, {
|
|
17
|
+
email: string;
|
|
18
|
+
password: string;
|
|
19
|
+
}, {
|
|
20
|
+
email: string;
|
|
21
|
+
password: string;
|
|
22
|
+
}>;
|
|
23
|
+
/**
|
|
24
|
+
* Password hashing utilities
|
|
25
|
+
* For D1/Cloudflare, we use PBKDF2 (built-in Web Crypto API)
|
|
26
|
+
*/
|
|
27
|
+
export declare function hashPassword(password: string): Promise<string>;
|
|
28
|
+
/**
|
|
29
|
+
* Verify password against hash
|
|
30
|
+
*/
|
|
31
|
+
export declare function verifyPassword(password: string, hash: string): Promise<boolean>;
|
|
32
|
+
/**
|
|
33
|
+
* JWT token generation and verification
|
|
34
|
+
*/
|
|
35
|
+
export interface JWTPayload {
|
|
36
|
+
userId: string;
|
|
37
|
+
email: string;
|
|
38
|
+
iat: number;
|
|
39
|
+
exp: number;
|
|
40
|
+
type: 'access' | 'refresh';
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Create JWT token (simple implementation without external library)
|
|
44
|
+
* Note: In production, consider using a library like `jose` or `jsonwebtoken`
|
|
45
|
+
*/
|
|
46
|
+
export declare function createJWT(payload: Omit<JWTPayload, 'iat' | 'exp'>, secret: string, expiresIn: number): string;
|
|
47
|
+
/**
|
|
48
|
+
* Parse JWT token (simple implementation)
|
|
49
|
+
*/
|
|
50
|
+
export declare function parseJWT(token: string): JWTPayload | null;
|
|
51
|
+
/**
|
|
52
|
+
* Authentication service
|
|
53
|
+
*/
|
|
54
|
+
export declare class AuthService {
|
|
55
|
+
/**
|
|
56
|
+
* Register a new user
|
|
57
|
+
*/
|
|
58
|
+
static registerUser(request: RegisterRequest, onCreateUser: (user: User) => Promise<void>): Promise<User>;
|
|
59
|
+
/**
|
|
60
|
+
* Login user
|
|
61
|
+
*/
|
|
62
|
+
static loginUser(request: LoginRequest, onGetUser: (email: string) => Promise<User & {
|
|
63
|
+
passwordHash: string;
|
|
64
|
+
}>, secret: string): Promise<AuthTokens>;
|
|
65
|
+
/**
|
|
66
|
+
* Refresh access token
|
|
67
|
+
*/
|
|
68
|
+
static refreshToken(refreshToken: string, secret: string): string;
|
|
69
|
+
}
|
|
70
|
+
export default AuthService;
|
|
71
|
+
//# sourceMappingURL=auth-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-service.d.ts","sourceRoot":"","sources":["../../../../../core/src/auth/auth-service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzF,eAAO,MAAM,WAAW;;;;;;;;;EAGtB,CAAC;AAEH,eAAO,MAAM,cAAc;;;;;;;;;EAGzB,CAAC;AAEH;;;GAGG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BpE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA4CrF;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,GAAG,KAAK,CAAC,EACxC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,MAAM,CAmBR;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAkBzD;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB;;OAEG;WACU,YAAY,CACvB,OAAO,EAAE,eAAe,EACxB,YAAY,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,GAC1C,OAAO,CAAC,IAAI,CAAC;IAuBhB;;OAEG;WACU,SAAS,CACpB,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,GAAG;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,EACtE,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,CAAC;IAiCtB;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;CAYlE;AAED,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// Authentication service
|
|
2
|
+
// Handles password hashing, JWT generation, and token management
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
// Validation schemas
|
|
5
|
+
export const LoginSchema = z.object({
|
|
6
|
+
email: z.string().email('Invalid email'),
|
|
7
|
+
password: z.string().min(8, 'Password must be at least 8 characters'),
|
|
8
|
+
});
|
|
9
|
+
export const RegisterSchema = z.object({
|
|
10
|
+
email: z.string().email('Invalid email'),
|
|
11
|
+
password: z.string().min(8, 'Password must be at least 8 characters'),
|
|
12
|
+
});
|
|
13
|
+
/**
|
|
14
|
+
* Password hashing utilities
|
|
15
|
+
* For D1/Cloudflare, we use PBKDF2 (built-in Web Crypto API)
|
|
16
|
+
*/
|
|
17
|
+
export async function hashPassword(password) {
|
|
18
|
+
// Using PBKDF2 with Web Crypto API available in Cloudflare Workers
|
|
19
|
+
const encoder = new TextEncoder();
|
|
20
|
+
const data = encoder.encode(password);
|
|
21
|
+
const salt = crypto.getRandomValues(new Uint8Array(16));
|
|
22
|
+
const key = await crypto.subtle.importKey('raw', data, { name: 'PBKDF2' }, false, ['deriveBits']);
|
|
23
|
+
const bits = await crypto.subtle.deriveBits({
|
|
24
|
+
name: 'PBKDF2',
|
|
25
|
+
salt: salt,
|
|
26
|
+
iterations: 100000,
|
|
27
|
+
hash: 'SHA-256',
|
|
28
|
+
}, key, 256);
|
|
29
|
+
// Combine salt + hash and encode as hex
|
|
30
|
+
const hashArray = new Uint8Array(bits);
|
|
31
|
+
const saltHex = Array.from(salt)
|
|
32
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
33
|
+
.join('');
|
|
34
|
+
const hashHex = Array.from(hashArray)
|
|
35
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
36
|
+
.join('');
|
|
37
|
+
return `pbkdf2:${saltHex}:${hashHex}`;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Verify password against hash
|
|
41
|
+
*/
|
|
42
|
+
export async function verifyPassword(password, hash) {
|
|
43
|
+
if (!hash.startsWith('pbkdf2:')) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
const parts = hash.split(':');
|
|
47
|
+
if (parts.length !== 3) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
const [, saltHex, storedHashHex] = parts;
|
|
51
|
+
try {
|
|
52
|
+
const encoder = new TextEncoder();
|
|
53
|
+
const data = encoder.encode(password);
|
|
54
|
+
// Convert hex salt back to bytes
|
|
55
|
+
const salt = new Uint8Array(saltHex.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
|
|
56
|
+
const key = await crypto.subtle.importKey('raw', data, { name: 'PBKDF2' }, false, [
|
|
57
|
+
'deriveBits',
|
|
58
|
+
]);
|
|
59
|
+
const bits = await crypto.subtle.deriveBits({
|
|
60
|
+
name: 'PBKDF2',
|
|
61
|
+
salt: salt,
|
|
62
|
+
iterations: 100000,
|
|
63
|
+
hash: 'SHA-256',
|
|
64
|
+
}, key, 256);
|
|
65
|
+
const hashArray = new Uint8Array(bits);
|
|
66
|
+
const computedHashHex = Array.from(hashArray)
|
|
67
|
+
.map((b) => b.toString(16).padStart(2, '0'))
|
|
68
|
+
.join('');
|
|
69
|
+
return computedHashHex === storedHashHex;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
console.error('Password verification error:', error);
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Create JWT token (simple implementation without external library)
|
|
78
|
+
* Note: In production, consider using a library like `jose` or `jsonwebtoken`
|
|
79
|
+
*/
|
|
80
|
+
export function createJWT(payload, secret, expiresIn) {
|
|
81
|
+
const header = {
|
|
82
|
+
alg: 'HS256',
|
|
83
|
+
typ: 'JWT',
|
|
84
|
+
};
|
|
85
|
+
const now = Math.floor(Date.now() / 1000);
|
|
86
|
+
const jwtPayload = {
|
|
87
|
+
...payload,
|
|
88
|
+
iat: now,
|
|
89
|
+
exp: now + expiresIn,
|
|
90
|
+
};
|
|
91
|
+
const headerEncoded = btoa(JSON.stringify(header));
|
|
92
|
+
const payloadEncoded = btoa(JSON.stringify(jwtPayload));
|
|
93
|
+
// For now, return a placeholder token with payload info
|
|
94
|
+
// Full HMAC implementation would require crypto-js or jose library
|
|
95
|
+
return `${headerEncoded}.${payloadEncoded}.signature-placeholder`;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Parse JWT token (simple implementation)
|
|
99
|
+
*/
|
|
100
|
+
export function parseJWT(token) {
|
|
101
|
+
try {
|
|
102
|
+
const parts = token.split('.');
|
|
103
|
+
if (parts.length !== 3) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
const payload = JSON.parse(atob(parts[1]));
|
|
107
|
+
const now = Math.floor(Date.now() / 1000);
|
|
108
|
+
if (payload.exp && payload.exp < now) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
return payload;
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Authentication service
|
|
119
|
+
*/
|
|
120
|
+
export class AuthService {
|
|
121
|
+
/**
|
|
122
|
+
* Register a new user
|
|
123
|
+
*/
|
|
124
|
+
static async registerUser(request, onCreateUser) {
|
|
125
|
+
// Validate input
|
|
126
|
+
const validated = RegisterSchema.parse(request);
|
|
127
|
+
// Hash password
|
|
128
|
+
const passwordHash = await hashPassword(validated.password);
|
|
129
|
+
// Create user
|
|
130
|
+
const userId = `user_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
131
|
+
const now = Date.now();
|
|
132
|
+
const user = {
|
|
133
|
+
id: userId,
|
|
134
|
+
email: validated.email,
|
|
135
|
+
createdAt: now,
|
|
136
|
+
updatedAt: now,
|
|
137
|
+
};
|
|
138
|
+
await onCreateUser(user);
|
|
139
|
+
return user;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Login user
|
|
143
|
+
*/
|
|
144
|
+
static async loginUser(request, onGetUser, secret) {
|
|
145
|
+
// Validate input
|
|
146
|
+
const validated = LoginSchema.parse(request);
|
|
147
|
+
// Get user
|
|
148
|
+
const user = await onGetUser(validated.email);
|
|
149
|
+
// Verify password
|
|
150
|
+
const passwordValid = await verifyPassword(validated.password, user.passwordHash);
|
|
151
|
+
if (!passwordValid) {
|
|
152
|
+
throw new Error('Invalid credentials');
|
|
153
|
+
}
|
|
154
|
+
// Generate tokens
|
|
155
|
+
const accessToken = createJWT({ userId: user.id, email: user.email, type: 'access' }, secret, 3600 // 1 hour
|
|
156
|
+
);
|
|
157
|
+
const refreshToken = createJWT({ userId: user.id, email: user.email, type: 'refresh' }, secret, 604800 // 7 days
|
|
158
|
+
);
|
|
159
|
+
return {
|
|
160
|
+
accessToken,
|
|
161
|
+
refreshToken,
|
|
162
|
+
expiresIn: 3600,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Refresh access token
|
|
167
|
+
*/
|
|
168
|
+
static refreshToken(refreshToken, secret) {
|
|
169
|
+
const payload = parseJWT(refreshToken);
|
|
170
|
+
if (!payload || payload.type !== 'refresh') {
|
|
171
|
+
throw new Error('Invalid refresh token');
|
|
172
|
+
}
|
|
173
|
+
return createJWT({ userId: payload.userId, email: payload.email, type: 'access' }, secret, 3600);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
export default AuthService;
|
|
177
|
+
//# sourceMappingURL=auth-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-service.js","sourceRoot":"","sources":["../../../../../core/src/auth/auth-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../core/src/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../core/src/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encryption manager for field-level data encryption
|
|
3
|
+
* Handles encryption/decryption of sensitive fields at rest
|
|
4
|
+
*/
|
|
5
|
+
export interface EncryptionConfig {
|
|
6
|
+
entity: string;
|
|
7
|
+
fields: string[];
|
|
8
|
+
algorithm?: 'AES-GCM' | 'AES-CBC';
|
|
9
|
+
keyRotation?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface EncryptedValue {
|
|
12
|
+
ciphertext: string;
|
|
13
|
+
iv: string;
|
|
14
|
+
algorithm: string;
|
|
15
|
+
keyVersion?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface EncryptionKey {
|
|
18
|
+
id: string;
|
|
19
|
+
key: CryptoKey;
|
|
20
|
+
version: number;
|
|
21
|
+
algorithm: string;
|
|
22
|
+
createdAt: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Encryption manager for field-level encryption
|
|
26
|
+
*/
|
|
27
|
+
export declare class EncryptionManager {
|
|
28
|
+
private configs;
|
|
29
|
+
private currentKey;
|
|
30
|
+
private keyHistory;
|
|
31
|
+
constructor();
|
|
32
|
+
/**
|
|
33
|
+
* Register encryption configuration for an entity
|
|
34
|
+
*/
|
|
35
|
+
registerConfig(config: EncryptionConfig): void;
|
|
36
|
+
/**
|
|
37
|
+
* Get encryption configuration for an entity
|
|
38
|
+
*/
|
|
39
|
+
getConfig(entity: string): EncryptionConfig | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* Initialize encryption key from master key
|
|
42
|
+
*/
|
|
43
|
+
initializeKey(masterKey: string, version?: number): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Rotate encryption key (for key rotation support)
|
|
46
|
+
*/
|
|
47
|
+
rotateKey(newMasterKey: string): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Encrypt a value
|
|
50
|
+
*/
|
|
51
|
+
encrypt(value: any): Promise<EncryptedValue>;
|
|
52
|
+
/**
|
|
53
|
+
* Decrypt a value
|
|
54
|
+
*/
|
|
55
|
+
decrypt(encrypted: EncryptedValue): Promise<any>;
|
|
56
|
+
/**
|
|
57
|
+
* Encrypt fields in a record based on entity configuration
|
|
58
|
+
*/
|
|
59
|
+
encryptRecord(entity: string, record: Record<string, any>): Promise<Record<string, any>>;
|
|
60
|
+
/**
|
|
61
|
+
* Decrypt fields in a record based on entity configuration
|
|
62
|
+
*/
|
|
63
|
+
decryptRecord(entity: string, record: Record<string, any>): Promise<Record<string, any>>;
|
|
64
|
+
/**
|
|
65
|
+
* Check if a field should be encrypted
|
|
66
|
+
*/
|
|
67
|
+
shouldEncrypt(entity: string, field: string): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Get all encrypted fields for an entity
|
|
70
|
+
*/
|
|
71
|
+
getEncryptedFields(entity: string): string[];
|
|
72
|
+
/**
|
|
73
|
+
* Re-encrypt a record with a new key (for key rotation)
|
|
74
|
+
*/
|
|
75
|
+
reencryptRecord(entity: string, record: Record<string, any>): Promise<Record<string, any>>;
|
|
76
|
+
/**
|
|
77
|
+
* Derive key material from master key
|
|
78
|
+
*/
|
|
79
|
+
private deriveKeyMaterial;
|
|
80
|
+
/**
|
|
81
|
+
* Convert ArrayBuffer to Base64
|
|
82
|
+
*/
|
|
83
|
+
private arrayBufferToBase64;
|
|
84
|
+
/**
|
|
85
|
+
* Convert Base64 to ArrayBuffer
|
|
86
|
+
*/
|
|
87
|
+
private base64ToArrayBuffer;
|
|
88
|
+
/**
|
|
89
|
+
* Clear all encryption keys (security)
|
|
90
|
+
*/
|
|
91
|
+
clear(): void;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Global encryption manager instance
|
|
95
|
+
*/
|
|
96
|
+
export declare const encryptionManager: EncryptionManager;
|
|
97
|
+
//# sourceMappingURL=encryption-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption-manager.d.ts","sourceRoot":"","sources":["../../../../../core/src/encryption/encryption-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAClC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,SAAS,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,UAAU,CAAyC;;IAI3D;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAI9C;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIvD;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B1E;;OAEG;IACG,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpD;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC;IAiClD;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC;IAkCtD;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAqB9F;;OAEG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IA+B9F;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAKrD;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAK5C;;OAEG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAQhG;;OAEG;YACW,iBAAiB;IAW/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,KAAK,IAAI,IAAI;CAId;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
|