@memberjunction/external-data-source-mongodb 0.0.0 → 5.45.0
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/dist/MongoExternalDataSourceDriver.d.ts +25 -0
- package/dist/MongoExternalDataSourceDriver.d.ts.map +1 -0
- package/dist/MongoExternalDataSourceDriver.js +245 -0
- package/dist/MongoExternalDataSourceDriver.js.map +1 -0
- package/dist/MongoFilterTranslator.d.ts +13 -0
- package/dist/MongoFilterTranslator.d.ts.map +1 -0
- package/dist/MongoFilterTranslator.js +252 -0
- package/dist/MongoFilterTranslator.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/package.json +32 -7
- package/README.md +0 -45
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Db } from 'mongodb';
|
|
2
|
+
import { UserInfo, ExternalSchemaDescriptor } from '@memberjunction/core';
|
|
3
|
+
import { MJExternalDataSourceEntity } from '@memberjunction/core-entities';
|
|
4
|
+
import { BaseExternalDataSourceDriver, ExternalConnectionTestResult, ExternalViewParams, ExternalViewResult, ExternalQueryParameter, ExternalQueryResult, ExternalRow } from '@memberjunction/external-data-sources';
|
|
5
|
+
export declare class MongoExternalDataSourceDriver extends BaseExternalDataSourceDriver<Db> {
|
|
6
|
+
private clients;
|
|
7
|
+
protected getConnection(dataSource: MJExternalDataSourceEntity, contextUser?: UserInfo): Promise<Db>;
|
|
8
|
+
private startClient;
|
|
9
|
+
protected peekConnection(dataSourceId: string): unknown;
|
|
10
|
+
protected invalidateConnection(dataSourceId: string, expectedIdentity?: unknown): Promise<void>;
|
|
11
|
+
TestConnection(dataSource: MJExternalDataSourceEntity, contextUser?: UserInfo): Promise<ExternalConnectionTestResult>;
|
|
12
|
+
RunView<TRow extends ExternalRow = ExternalRow>(dataSource: MJExternalDataSourceEntity, params: ExternalViewParams, contextUser?: UserInfo): Promise<ExternalViewResult<TRow>>;
|
|
13
|
+
LoadSingle<TRow extends ExternalRow = ExternalRow>(dataSource: MJExternalDataSourceEntity, objectName: string, primaryKeys: readonly ExternalQueryParameter[], contextUser?: UserInfo): Promise<TRow | null>;
|
|
14
|
+
RunNativeQuery<TRow extends ExternalRow = ExternalRow>(dataSource: MJExternalDataSourceEntity, queryText: string, params: ExternalQueryParameter[] | undefined, contextUser?: UserInfo): Promise<ExternalQueryResult<TRow>>;
|
|
15
|
+
IntrospectSchema(dataSource: MJExternalDataSourceEntity, _schemaName: string | undefined, contextUser?: UserInfo): Promise<ExternalSchemaDescriptor>;
|
|
16
|
+
Close(): Promise<void>;
|
|
17
|
+
private static readonly WriteStages;
|
|
18
|
+
protected assertReadOnlyPipeline(pipeline: unknown[]): void;
|
|
19
|
+
private assertNoWriteStageDeep;
|
|
20
|
+
private buildProjection;
|
|
21
|
+
private parseSort;
|
|
22
|
+
private inferColumns;
|
|
23
|
+
private jsType;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=MongoExternalDataSourceDriver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MongoExternalDataSourceDriver.d.ts","sourceRoot":"","sources":["../src/MongoExternalDataSourceDriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmC,EAAE,EAA+B,MAAM,SAAS,CAAC;AAE3F,OAAO,EAAE,QAAQ,EAAwB,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChG,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EACL,4BAA4B,EAC5B,4BAA4B,EAC5B,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,WAAW,EACZ,MAAM,uCAAuC,CAAC;AAgD/C,qBACa,6BAA8B,SAAQ,4BAA4B,CAAC,EAAE,CAAC;IAIjF,OAAO,CAAC,OAAO,CAA2C;cAE1C,aAAa,CAAC,UAAU,EAAE,0BAA0B,EAAE,WAAW,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,EAAE,CAAC;YAoB5F,WAAW;IAyCzB,SAAS,CAAC,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;cAIvC,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxF,cAAc,CAAC,UAAU,EAAE,0BAA0B,EAAE,WAAW,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,4BAA4B,CAAC;IAcrH,OAAO,CAAC,IAAI,SAAS,WAAW,GAAG,WAAW,EACzD,UAAU,EAAE,0BAA0B,EACtC,MAAM,EAAE,kBAAkB,EAC1B,WAAW,CAAC,EAAE,QAAQ,GACrB,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IA6BvB,UAAU,CAAC,IAAI,SAAS,WAAW,GAAG,WAAW,EAC5D,UAAU,EAAE,0BAA0B,EACtC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,SAAS,sBAAsB,EAAE,EAC9C,WAAW,CAAC,EAAE,QAAQ,GACrB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAoBV,cAAc,CAAC,IAAI,SAAS,WAAW,GAAG,WAAW,EAChE,UAAU,EAAE,0BAA0B,EACtC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,sBAAsB,EAAE,GAAG,SAAS,EAC5C,WAAW,CAAC,EAAE,QAAQ,GACrB,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IA0BxB,gBAAgB,CAC3B,UAAU,EAAE,0BAA0B,EACtC,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,WAAW,CAAC,EAAE,QAAQ,GACrB,OAAO,CAAC,wBAAwB,CAAC;IAYvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBnC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAA+B;IAQlE,SAAS,CAAC,sBAAsB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI;IAI3D,OAAO,CAAC,sBAAsB;IAe9B,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,MAAM;CAMf"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var MongoExternalDataSourceDriver_1;
|
|
8
|
+
import { MongoClient } from 'mongodb';
|
|
9
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
10
|
+
import { BaseExternalDataSourceDriver, } from '@memberjunction/external-data-sources';
|
|
11
|
+
import { MongoFilterTranslator } from './MongoFilterTranslator.js';
|
|
12
|
+
let MongoExternalDataSourceDriver = class MongoExternalDataSourceDriver extends BaseExternalDataSourceDriver {
|
|
13
|
+
constructor() {
|
|
14
|
+
super(...arguments);
|
|
15
|
+
this.clients = new Map();
|
|
16
|
+
}
|
|
17
|
+
static { MongoExternalDataSourceDriver_1 = this; }
|
|
18
|
+
async getConnection(dataSource, contextUser) {
|
|
19
|
+
const dbName = dataSource.DefaultDatabase;
|
|
20
|
+
if (!dbName) {
|
|
21
|
+
throw new Error(`ExternalDataSource '${dataSource.Name}' has no DefaultDatabase (MongoDB dbName).`);
|
|
22
|
+
}
|
|
23
|
+
const existing = this.clients.get(dataSource.ID);
|
|
24
|
+
const client = existing ?? this.startClient(dataSource, contextUser);
|
|
25
|
+
if (!existing) {
|
|
26
|
+
this.clients.set(dataSource.ID, client);
|
|
27
|
+
client.catch(() => {
|
|
28
|
+
if (this.clients.get(dataSource.ID) === client) {
|
|
29
|
+
this.clients.delete(dataSource.ID);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return (await client).db(dbName);
|
|
34
|
+
}
|
|
35
|
+
async startClient(dataSource, contextUser) {
|
|
36
|
+
const config = this.parseConnectionConfig(dataSource);
|
|
37
|
+
const cred = await this.resolveCredential(dataSource, contextUser);
|
|
38
|
+
const url = config.uri ?? `mongodb://${config.host ?? 'localhost'}:${config.port ?? 27017}`;
|
|
39
|
+
const tlsEnabled = config.tls === true || /^mongodb\+srv:\/\//i.test(url) || /[?&](tls|ssl)=true/i.test(url);
|
|
40
|
+
const authority = config.uri
|
|
41
|
+
? (config.uri.replace(/^mongodb(\+srv)?:\/\//i, '').split(/[/?]/)[0].split('@').pop() ?? '')
|
|
42
|
+
: (config.host ?? '');
|
|
43
|
+
const stripPort = (h) => (h.startsWith('[') ? h.slice(0, h.indexOf(']') + 1) : h.split(':')[0]);
|
|
44
|
+
const seedHosts = authority.split(',').map((h) => stripPort(h.trim())).filter(Boolean);
|
|
45
|
+
const gateHost = seedHosts.find((h) => !this.isLocalHost(h)) ?? seedHosts[0] ?? config.host;
|
|
46
|
+
this.assertSecureTransport({ host: gateHost, tlsEnabled, allowInsecure: config.allowInsecureTransport, dataSourceName: dataSource.Name });
|
|
47
|
+
const options = {};
|
|
48
|
+
if (config.tls === true) {
|
|
49
|
+
options.tls = true;
|
|
50
|
+
}
|
|
51
|
+
if (cred) {
|
|
52
|
+
options.auth = { username: cred.values.username, password: cred.values.password };
|
|
53
|
+
options.authSource = config.authSource ?? 'admin';
|
|
54
|
+
}
|
|
55
|
+
const client = new MongoClient(url, options);
|
|
56
|
+
try {
|
|
57
|
+
await client.connect();
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
await client.close().catch(() => { });
|
|
61
|
+
throw e;
|
|
62
|
+
}
|
|
63
|
+
return client;
|
|
64
|
+
}
|
|
65
|
+
peekConnection(dataSourceId) {
|
|
66
|
+
return this.clients.get(dataSourceId);
|
|
67
|
+
}
|
|
68
|
+
async invalidateConnection(dataSourceId, expectedIdentity) {
|
|
69
|
+
const existing = this.clients.get(dataSourceId);
|
|
70
|
+
if (expectedIdentity !== undefined && existing !== expectedIdentity) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (existing) {
|
|
74
|
+
this.clients.delete(dataSourceId);
|
|
75
|
+
try {
|
|
76
|
+
await (await existing).close();
|
|
77
|
+
}
|
|
78
|
+
catch { }
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async TestConnection(dataSource, contextUser) {
|
|
82
|
+
const start = Date.now();
|
|
83
|
+
try {
|
|
84
|
+
const db = await this.getConnection(dataSource, contextUser);
|
|
85
|
+
await db.listCollections({}, { nameOnly: true }).toArray();
|
|
86
|
+
return { success: true, message: 'Connection successful.', testedAt: new Date(), latencyMs: Date.now() - start };
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
return { success: false, message: this.errorText(e), testedAt: new Date(), latencyMs: Date.now() - start };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async RunView(dataSource, params, contextUser) {
|
|
93
|
+
const start = Date.now();
|
|
94
|
+
try {
|
|
95
|
+
return await this.withConnectionRetry(dataSource, async () => {
|
|
96
|
+
const db = await this.getConnection(dataSource, contextUser);
|
|
97
|
+
const config = this.parseConnectionConfig(dataSource);
|
|
98
|
+
const coll = db.collection(params.objectName);
|
|
99
|
+
const filter = MongoFilterTranslator.Translate(params.filter, { caseInsensitiveLike: config.caseInsensitiveLike });
|
|
100
|
+
const options = {};
|
|
101
|
+
if (params.fields?.length)
|
|
102
|
+
options.projection = this.buildProjection(params.fields);
|
|
103
|
+
if (params.orderBy) {
|
|
104
|
+
options.sort = this.parseSort(params.orderBy);
|
|
105
|
+
}
|
|
106
|
+
else if (params.defaultOrderByColumns?.length) {
|
|
107
|
+
options.sort = Object.fromEntries(params.defaultOrderByColumns.map((c) => [c, 1]));
|
|
108
|
+
}
|
|
109
|
+
if (params.offset != null)
|
|
110
|
+
options.skip = params.offset;
|
|
111
|
+
if (params.maxRows != null)
|
|
112
|
+
options.limit = params.maxRows;
|
|
113
|
+
const rows = await coll.find(filter, options).toArray();
|
|
114
|
+
const totalRowCount = params.maxRows != null ? await coll.countDocuments(filter) : undefined;
|
|
115
|
+
return { success: true, rows: this.normalizeRows(rows), totalRowCount, executionTimeMs: Date.now() - start };
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
catch (e) {
|
|
119
|
+
return { success: false, rows: [], errorMessage: this.errorText(e), executionTimeMs: Date.now() - start };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async LoadSingle(dataSource, objectName, primaryKeys, contextUser) {
|
|
123
|
+
if (primaryKeys.length === 0) {
|
|
124
|
+
throw new Error("MongoDB LoadSingle requires at least one primary-key value.");
|
|
125
|
+
}
|
|
126
|
+
return await this.withConnectionRetry(dataSource, async () => {
|
|
127
|
+
const db = await this.getConnection(dataSource, contextUser);
|
|
128
|
+
const filter = {};
|
|
129
|
+
for (const pk of primaryKeys) {
|
|
130
|
+
filter[pk.name] = MongoFilterTranslator.CoerceObjectId(pk.name, pk.value);
|
|
131
|
+
}
|
|
132
|
+
const doc = await db.collection(objectName).findOne(filter);
|
|
133
|
+
return doc ? this.normalizeRows([doc])[0] : null;
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
async RunNativeQuery(dataSource, queryText, params, contextUser) {
|
|
137
|
+
const start = Date.now();
|
|
138
|
+
try {
|
|
139
|
+
if (params && params.length > 0) {
|
|
140
|
+
throw new Error('MongoDB native queries do not support bound parameters; embed values directly in the pipeline JSON.');
|
|
141
|
+
}
|
|
142
|
+
return await this.withConnectionRetry(dataSource, async () => {
|
|
143
|
+
const db = await this.getConnection(dataSource, contextUser);
|
|
144
|
+
const spec = JSON.parse(queryText);
|
|
145
|
+
if (!spec.collection || !Array.isArray(spec.pipeline)) {
|
|
146
|
+
throw new Error('MongoDB native query must be JSON of the form { "collection": "<name>", "pipeline": [ ... ] }.');
|
|
147
|
+
}
|
|
148
|
+
this.assertReadOnlyPipeline(spec.pipeline);
|
|
149
|
+
const rows = await db.collection(spec.collection).aggregate(spec.pipeline).toArray();
|
|
150
|
+
return { success: true, rows: this.normalizeRows(rows), rowCount: rows.length, executionTimeMs: Date.now() - start };
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
catch (e) {
|
|
154
|
+
return { success: false, rows: [], rowCount: 0, errorMessage: this.errorText(e), executionTimeMs: Date.now() - start };
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async IntrospectSchema(dataSource, _schemaName, contextUser) {
|
|
158
|
+
const db = await this.getConnection(dataSource, contextUser);
|
|
159
|
+
const collections = await db.listCollections().toArray();
|
|
160
|
+
const objects = [];
|
|
161
|
+
for (const c of collections) {
|
|
162
|
+
const sample = await db.collection(c.name).find({}).limit(25).toArray();
|
|
163
|
+
objects.push({ Name: c.name, ObjectType: 'collection', Columns: this.inferColumns(sample) });
|
|
164
|
+
}
|
|
165
|
+
return { Database: dataSource.DefaultDatabase ?? undefined, Objects: objects };
|
|
166
|
+
}
|
|
167
|
+
async Close() {
|
|
168
|
+
const inFlight = Array.from(this.clients.values());
|
|
169
|
+
this.clients.clear();
|
|
170
|
+
await Promise.all(inFlight.map(async (p) => {
|
|
171
|
+
try {
|
|
172
|
+
await (await p).close();
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
}
|
|
176
|
+
}));
|
|
177
|
+
}
|
|
178
|
+
static { this.WriteStages = new Set(['$out', '$merge']); }
|
|
179
|
+
assertReadOnlyPipeline(pipeline) {
|
|
180
|
+
this.assertNoWriteStageDeep(pipeline);
|
|
181
|
+
}
|
|
182
|
+
assertNoWriteStageDeep(node) {
|
|
183
|
+
if (Array.isArray(node)) {
|
|
184
|
+
for (const item of node)
|
|
185
|
+
this.assertNoWriteStageDeep(item);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
if (node && typeof node === 'object') {
|
|
189
|
+
for (const [key, value] of Object.entries(node)) {
|
|
190
|
+
if (MongoExternalDataSourceDriver_1.WriteStages.has(key)) {
|
|
191
|
+
throw new Error(`MongoDB native query contains a forbidden write stage '${key}'. External data sources are read-only.`);
|
|
192
|
+
}
|
|
193
|
+
this.assertNoWriteStageDeep(value);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
buildProjection(fields) {
|
|
198
|
+
const proj = {};
|
|
199
|
+
for (const f of fields)
|
|
200
|
+
proj[f] = 1;
|
|
201
|
+
if (!fields.includes('_id'))
|
|
202
|
+
proj._id = 0;
|
|
203
|
+
return proj;
|
|
204
|
+
}
|
|
205
|
+
parseSort(orderBy) {
|
|
206
|
+
const sort = {};
|
|
207
|
+
for (const part of orderBy.split(',')) {
|
|
208
|
+
const [field, dir] = part.trim().split(/\s+/);
|
|
209
|
+
if (field)
|
|
210
|
+
sort[field] = dir && dir.toUpperCase() === 'DESC' ? -1 : 1;
|
|
211
|
+
}
|
|
212
|
+
return sort;
|
|
213
|
+
}
|
|
214
|
+
inferColumns(docs) {
|
|
215
|
+
const types = new Map();
|
|
216
|
+
for (const d of docs) {
|
|
217
|
+
for (const [k, v] of Object.entries(d)) {
|
|
218
|
+
if (v != null && (!types.has(k) || types.get(k) === 'null'))
|
|
219
|
+
types.set(k, this.jsType(v));
|
|
220
|
+
else if (!types.has(k))
|
|
221
|
+
types.set(k, 'null');
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return [...types.entries()].map(([name, t]) => ({
|
|
225
|
+
Name: name,
|
|
226
|
+
NativeType: t,
|
|
227
|
+
Nullable: name !== '_id',
|
|
228
|
+
IsPrimaryKey: name === '_id',
|
|
229
|
+
}));
|
|
230
|
+
}
|
|
231
|
+
jsType(v) {
|
|
232
|
+
if (v instanceof Date)
|
|
233
|
+
return 'date';
|
|
234
|
+
if (Array.isArray(v))
|
|
235
|
+
return 'array';
|
|
236
|
+
if (v !== null && typeof v === 'object')
|
|
237
|
+
return 'object';
|
|
238
|
+
return typeof v;
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
MongoExternalDataSourceDriver = MongoExternalDataSourceDriver_1 = __decorate([
|
|
242
|
+
RegisterClass(BaseExternalDataSourceDriver, 'MongoExternalDriver')
|
|
243
|
+
], MongoExternalDataSourceDriver);
|
|
244
|
+
export { MongoExternalDataSourceDriver };
|
|
245
|
+
//# sourceMappingURL=MongoExternalDataSourceDriver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MongoExternalDataSourceDriver.js","sourceRoot":"","sources":["../src/MongoExternalDataSourceDriver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type MongoFilter = Record<string, unknown>;
|
|
2
|
+
type Primitive = string | number | boolean | null;
|
|
3
|
+
export interface MongoFilterOptions {
|
|
4
|
+
caseInsensitiveLike?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare class MongoFilterTranslator {
|
|
7
|
+
static Translate(sql: string | undefined, options?: MongoFilterOptions): MongoFilter;
|
|
8
|
+
static Comparison(field: string, op: string, value: Primitive): MongoFilter;
|
|
9
|
+
static CoerceObjectId(field: string, value: unknown): unknown;
|
|
10
|
+
static LikeToRegex(pattern: string): string;
|
|
11
|
+
}
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=MongoFilterTranslator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MongoFilterTranslator.d.ts","sourceRoot":"","sources":["../src/MongoFilterTranslator.ts"],"names":[],"mappings":"AAqBA,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC3C,KAAK,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AAGlD,MAAM,WAAW,kBAAkB;IAMjC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAoKD,qBAAa,qBAAqB;WAElB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,WAAW;WAK7E,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,WAAW;WAoBpE,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO;WAQtD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAkBnD"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { ObjectId } from 'mongodb';
|
|
2
|
+
const KEYWORDS = new Set(['AND', 'OR', 'IN', 'IS', 'NOT', 'NULL', 'LIKE', 'TRUE', 'FALSE']);
|
|
3
|
+
function tokenize(input) {
|
|
4
|
+
const tokens = [];
|
|
5
|
+
let i = 0;
|
|
6
|
+
const isIdentStart = (c) => /[A-Za-z_]/.test(c);
|
|
7
|
+
const isIdentPart = (c) => /[A-Za-z0-9_.]/.test(c);
|
|
8
|
+
while (i < input.length) {
|
|
9
|
+
const c = input[i];
|
|
10
|
+
if (/\s/.test(c)) {
|
|
11
|
+
i++;
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
if (c === '(') {
|
|
15
|
+
tokens.push({ kind: 'lparen' });
|
|
16
|
+
i++;
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
if (c === ')') {
|
|
20
|
+
tokens.push({ kind: 'rparen' });
|
|
21
|
+
i++;
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (c === ',') {
|
|
25
|
+
tokens.push({ kind: 'comma' });
|
|
26
|
+
i++;
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (c === '!' && input[i + 1] === '=') {
|
|
30
|
+
tokens.push({ kind: 'op', value: '!=' });
|
|
31
|
+
i += 2;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (c === '<' && input[i + 1] === '>') {
|
|
35
|
+
tokens.push({ kind: 'op', value: '!=' });
|
|
36
|
+
i += 2;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (c === '>' && input[i + 1] === '=') {
|
|
40
|
+
tokens.push({ kind: 'op', value: '>=' });
|
|
41
|
+
i += 2;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (c === '<' && input[i + 1] === '=') {
|
|
45
|
+
tokens.push({ kind: 'op', value: '<=' });
|
|
46
|
+
i += 2;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (c === '=' || c === '>' || c === '<') {
|
|
50
|
+
tokens.push({ kind: 'op', value: c });
|
|
51
|
+
i++;
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (c === "'") {
|
|
55
|
+
let s = '';
|
|
56
|
+
i++;
|
|
57
|
+
while (i < input.length) {
|
|
58
|
+
if (input[i] === "'" && input[i + 1] === "'") {
|
|
59
|
+
s += "'";
|
|
60
|
+
i += 2;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (input[i] === "'") {
|
|
64
|
+
i++;
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
s += input[i++];
|
|
68
|
+
}
|
|
69
|
+
tokens.push({ kind: 'string', value: s });
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (/[0-9]/.test(c) || (c === '-' && /[0-9]/.test(input[i + 1] ?? ''))) {
|
|
73
|
+
let n = c;
|
|
74
|
+
i++;
|
|
75
|
+
while (i < input.length && /[0-9.]/.test(input[i]))
|
|
76
|
+
n += input[i++];
|
|
77
|
+
const num = Number(n);
|
|
78
|
+
if (!Number.isFinite(num)) {
|
|
79
|
+
throw new Error(`Invalid numeric literal '${n}' in filter.`);
|
|
80
|
+
}
|
|
81
|
+
tokens.push({ kind: 'number', value: num });
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (isIdentStart(c)) {
|
|
85
|
+
let id = c;
|
|
86
|
+
i++;
|
|
87
|
+
while (i < input.length && isIdentPart(input[i]))
|
|
88
|
+
id += input[i++];
|
|
89
|
+
const upper = id.toUpperCase();
|
|
90
|
+
tokens.push(KEYWORDS.has(upper) ? { kind: 'kw', value: upper } : { kind: 'ident', value: id });
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
throw new Error(`Unexpected character '${c}' at position ${i} in filter.`);
|
|
94
|
+
}
|
|
95
|
+
return tokens;
|
|
96
|
+
}
|
|
97
|
+
class Parser {
|
|
98
|
+
constructor(tokens, caseInsensitiveLike) {
|
|
99
|
+
this.tokens = tokens;
|
|
100
|
+
this.caseInsensitiveLike = caseInsensitiveLike;
|
|
101
|
+
this.pos = 0;
|
|
102
|
+
}
|
|
103
|
+
peek() { return this.tokens[this.pos]; }
|
|
104
|
+
next() { return this.tokens[this.pos++]; }
|
|
105
|
+
expect(kind) {
|
|
106
|
+
const t = this.next();
|
|
107
|
+
if (!t || t.kind !== kind)
|
|
108
|
+
throw new Error(`Expected ${kind} in filter but got ${t ? JSON.stringify(t) : 'end of input'}.`);
|
|
109
|
+
return t;
|
|
110
|
+
}
|
|
111
|
+
isKw(v) { const t = this.peek(); return !!t && t.kind === 'kw' && t.value === v; }
|
|
112
|
+
parse() {
|
|
113
|
+
const f = this.parseOr();
|
|
114
|
+
if (this.pos !== this.tokens.length)
|
|
115
|
+
throw new Error('Unexpected trailing tokens in filter.');
|
|
116
|
+
return f;
|
|
117
|
+
}
|
|
118
|
+
parseOr() {
|
|
119
|
+
const parts = [this.parseAnd()];
|
|
120
|
+
while (this.isKw('OR')) {
|
|
121
|
+
this.next();
|
|
122
|
+
parts.push(this.parseAnd());
|
|
123
|
+
}
|
|
124
|
+
return parts.length === 1 ? parts[0] : { $or: parts };
|
|
125
|
+
}
|
|
126
|
+
parseAnd() {
|
|
127
|
+
const parts = [this.parsePrimary()];
|
|
128
|
+
while (this.isKw('AND')) {
|
|
129
|
+
this.next();
|
|
130
|
+
parts.push(this.parsePrimary());
|
|
131
|
+
}
|
|
132
|
+
return parts.length === 1 ? parts[0] : { $and: parts };
|
|
133
|
+
}
|
|
134
|
+
parsePrimary() {
|
|
135
|
+
if (this.peek()?.kind === 'lparen') {
|
|
136
|
+
this.next();
|
|
137
|
+
const inner = this.parseOr();
|
|
138
|
+
this.expect('rparen');
|
|
139
|
+
return inner;
|
|
140
|
+
}
|
|
141
|
+
return this.parsePredicate();
|
|
142
|
+
}
|
|
143
|
+
parsePredicate() {
|
|
144
|
+
const field = this.expect('ident').value;
|
|
145
|
+
const t = this.peek();
|
|
146
|
+
if (t?.kind === 'op') {
|
|
147
|
+
this.next();
|
|
148
|
+
const value = this.parseValue();
|
|
149
|
+
return MongoFilterTranslator.Comparison(field, t.value, value);
|
|
150
|
+
}
|
|
151
|
+
if (this.isKw('IN')) {
|
|
152
|
+
this.next();
|
|
153
|
+
return { [field]: { $in: this.parseValueList().map(v => MongoFilterTranslator.CoerceObjectId(field, v)) } };
|
|
154
|
+
}
|
|
155
|
+
if (this.isKw('NOT')) {
|
|
156
|
+
this.next();
|
|
157
|
+
if (!this.isKw('IN'))
|
|
158
|
+
throw new Error("Expected IN after NOT.");
|
|
159
|
+
this.next();
|
|
160
|
+
return { [field]: { $nin: this.parseValueList().map(v => MongoFilterTranslator.CoerceObjectId(field, v)) } };
|
|
161
|
+
}
|
|
162
|
+
if (this.isKw('IS')) {
|
|
163
|
+
this.next();
|
|
164
|
+
const negated = this.isKw('NOT');
|
|
165
|
+
if (negated)
|
|
166
|
+
this.next();
|
|
167
|
+
if (!this.isKw('NULL'))
|
|
168
|
+
throw new Error('Expected NULL after IS [NOT].');
|
|
169
|
+
this.next();
|
|
170
|
+
return { [field]: negated ? { $ne: null } : { $eq: null } };
|
|
171
|
+
}
|
|
172
|
+
if (this.isKw('LIKE')) {
|
|
173
|
+
this.next();
|
|
174
|
+
const pat = this.expect('string').value;
|
|
175
|
+
const regex = { $regex: MongoFilterTranslator.LikeToRegex(pat) };
|
|
176
|
+
if (this.caseInsensitiveLike)
|
|
177
|
+
regex.$options = 'i';
|
|
178
|
+
return { [field]: regex };
|
|
179
|
+
}
|
|
180
|
+
throw new Error(`Unsupported predicate for field '${field}' in filter.`);
|
|
181
|
+
}
|
|
182
|
+
parseValue() {
|
|
183
|
+
const t = this.next();
|
|
184
|
+
if (!t)
|
|
185
|
+
throw new Error('Expected a value in filter.');
|
|
186
|
+
if (t.kind === 'string')
|
|
187
|
+
return t.value;
|
|
188
|
+
if (t.kind === 'number')
|
|
189
|
+
return t.value;
|
|
190
|
+
if (t.kind === 'kw' && t.value === 'NULL')
|
|
191
|
+
return null;
|
|
192
|
+
if (t.kind === 'kw' && t.value === 'TRUE')
|
|
193
|
+
return true;
|
|
194
|
+
if (t.kind === 'kw' && t.value === 'FALSE')
|
|
195
|
+
return false;
|
|
196
|
+
throw new Error(`Expected a value in filter but got ${JSON.stringify(t)}.`);
|
|
197
|
+
}
|
|
198
|
+
parseValueList() {
|
|
199
|
+
this.expect('lparen');
|
|
200
|
+
const values = [this.parseValue()];
|
|
201
|
+
while (this.peek()?.kind === 'comma') {
|
|
202
|
+
this.next();
|
|
203
|
+
values.push(this.parseValue());
|
|
204
|
+
}
|
|
205
|
+
this.expect('rparen');
|
|
206
|
+
return values;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
export class MongoFilterTranslator {
|
|
210
|
+
static Translate(sql, options) {
|
|
211
|
+
if (!sql || !sql.trim())
|
|
212
|
+
return {};
|
|
213
|
+
return new Parser(tokenize(sql), options?.caseInsensitiveLike ?? true).parse();
|
|
214
|
+
}
|
|
215
|
+
static Comparison(field, op, value) {
|
|
216
|
+
const v = MongoFilterTranslator.CoerceObjectId(field, value);
|
|
217
|
+
switch (op) {
|
|
218
|
+
case '=': return { [field]: { $eq: v } };
|
|
219
|
+
case '!=': return { [field]: { $ne: v } };
|
|
220
|
+
case '>': return { [field]: { $gt: v } };
|
|
221
|
+
case '<': return { [field]: { $lt: v } };
|
|
222
|
+
case '>=': return { [field]: { $gte: v } };
|
|
223
|
+
case '<=': return { [field]: { $lte: v } };
|
|
224
|
+
default: throw new Error(`Unsupported operator '${op}' in filter.`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
static CoerceObjectId(field, value) {
|
|
228
|
+
if (field === '_id' && typeof value === 'string' && /^[0-9a-fA-F]{24}$/.test(value)) {
|
|
229
|
+
return new ObjectId(value);
|
|
230
|
+
}
|
|
231
|
+
return value;
|
|
232
|
+
}
|
|
233
|
+
static LikeToRegex(pattern) {
|
|
234
|
+
let out = '^';
|
|
235
|
+
let prevWildcard = false;
|
|
236
|
+
for (const ch of pattern) {
|
|
237
|
+
if (ch === '%') {
|
|
238
|
+
if (!prevWildcard)
|
|
239
|
+
out += '.*';
|
|
240
|
+
prevWildcard = true;
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
prevWildcard = false;
|
|
244
|
+
if (ch === '_')
|
|
245
|
+
out += '.';
|
|
246
|
+
else
|
|
247
|
+
out += ch.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
248
|
+
}
|
|
249
|
+
return out + '$';
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=MongoFilterTranslator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MongoFilterTranslator.js","sourceRoot":"","sources":["../src/MongoFilterTranslator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,iCAAiC,CAAC;AAChD,cAAc,yBAAyB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,iCAAiC,CAAC;AAChD,cAAc,yBAAyB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,35 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/external-data-source-mongodb",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
"version": "5.45.0",
|
|
4
|
+
"description": "MongoDB driver for the MemberJunction External Data Sources primitive. Registers a BaseExternalDataSourceDriver implementation via @RegisterClass(BaseExternalDataSourceDriver, 'MongoExternalDriver') using the official mongodb client, with a contained SQL-WHERE -> Mongo filter translator and document-sampling schema introspection.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"/dist"
|
|
10
|
+
],
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc && tsc-alias -f",
|
|
13
|
+
"test": "vitest run"
|
|
14
|
+
},
|
|
15
|
+
"author": "MemberJunction.com",
|
|
16
|
+
"license": "ISC",
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@memberjunction/core": "5.45.0",
|
|
19
|
+
"@memberjunction/global": "5.45.0",
|
|
20
|
+
"@memberjunction/core-entities": "5.45.0",
|
|
21
|
+
"@memberjunction/external-data-sources": "5.45.0",
|
|
22
|
+
"mongodb": "^6.10.0"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/node": "24.10.11",
|
|
26
|
+
"tsc-alias": "^1.8.16",
|
|
27
|
+
"ts-node-dev": "^2.0.0",
|
|
28
|
+
"vitest": "^3.1.1",
|
|
29
|
+
"typescript": "^5.9.3"
|
|
30
|
+
},
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "https://github.com/MemberJunction/MJ"
|
|
34
|
+
}
|
|
10
35
|
}
|
package/README.md
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# @memberjunction/external-data-source-mongodb
|
|
2
|
-
|
|
3
|
-
## ⚠️ IMPORTANT NOTICE ⚠️
|
|
4
|
-
|
|
5
|
-
**This package is created solely for the purpose of setting up OIDC (OpenID Connect) trusted publishing with npm.**
|
|
6
|
-
|
|
7
|
-
This is **NOT** a functional package and contains **NO** code or functionality beyond the OIDC setup configuration.
|
|
8
|
-
|
|
9
|
-
## Purpose
|
|
10
|
-
|
|
11
|
-
This package exists to:
|
|
12
|
-
1. Configure OIDC trusted publishing for the package name `@memberjunction/external-data-source-mongodb`
|
|
13
|
-
2. Enable secure, token-less publishing from CI/CD workflows
|
|
14
|
-
3. Establish provenance for packages published under this name
|
|
15
|
-
|
|
16
|
-
## What is OIDC Trusted Publishing?
|
|
17
|
-
|
|
18
|
-
OIDC trusted publishing allows package maintainers to publish packages directly from their CI/CD workflows without needing to manage npm access tokens. Instead, it uses OpenID Connect to establish trust between the CI/CD provider (like GitHub Actions) and npm.
|
|
19
|
-
|
|
20
|
-
## Setup Instructions
|
|
21
|
-
|
|
22
|
-
To properly configure OIDC trusted publishing for this package:
|
|
23
|
-
|
|
24
|
-
1. Go to [npmjs.com](https://www.npmjs.com/) and navigate to your package settings
|
|
25
|
-
2. Configure the trusted publisher (e.g., GitHub Actions)
|
|
26
|
-
3. Specify the repository and workflow that should be allowed to publish
|
|
27
|
-
4. Use the configured workflow to publish your actual package
|
|
28
|
-
|
|
29
|
-
## DO NOT USE THIS PACKAGE
|
|
30
|
-
|
|
31
|
-
This package is a placeholder for OIDC configuration only. It:
|
|
32
|
-
- Contains no executable code
|
|
33
|
-
- Provides no functionality
|
|
34
|
-
- Should not be installed as a dependency
|
|
35
|
-
- Exists only for administrative purposes
|
|
36
|
-
|
|
37
|
-
## More Information
|
|
38
|
-
|
|
39
|
-
For more details about npm's trusted publishing feature, see:
|
|
40
|
-
- [npm Trusted Publishing Documentation](https://docs.npmjs.com/generating-provenance-statements)
|
|
41
|
-
- [GitHub Actions OIDC Documentation](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)
|
|
42
|
-
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
**Maintained for OIDC setup purposes only**
|