@encodeagent/platform-helper-data 1.2510.1041539 → 1.2510.1282253
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/cosmosdb/index.d.ts +25 -0
- package/dist/cosmosdb/index.d.ts.map +1 -0
- package/dist/cosmosdb/index.js +210 -0
- package/dist/cosmosdb/index.js.map +1 -0
- package/dist/cosmosdb/query-builder.d.ts +10 -0
- package/dist/cosmosdb/query-builder.d.ts.map +1 -0
- package/dist/cosmosdb/query-builder.js +123 -0
- package/dist/cosmosdb/query-builder.js.map +1 -0
- package/dist/dynamodb/index.d.ts +24 -0
- package/dist/dynamodb/index.d.ts.map +1 -0
- package/dist/dynamodb/index.js +189 -0
- package/dist/dynamodb/index.js.map +1 -0
- package/dist/firestore/index.d.ts +9 -0
- package/dist/firestore/index.d.ts.map +1 -0
- package/dist/firestore/index.js +79 -0
- package/dist/firestore/index.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -7
- package/dist/index.js.map +1 -1
- package/dist/mongodb/index.d.ts +18 -0
- package/dist/mongodb/index.d.ts.map +1 -0
- package/dist/mongodb/index.js +208 -0
- package/dist/mongodb/index.js.map +1 -0
- package/dist/util.d.ts +125 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +40 -0
- package/dist/util.js.map +1 -0
- package/dist/wrapper/index.d.ts +31 -6
- package/dist/wrapper/index.d.ts.map +1 -1
- package/dist/wrapper/index.js +197 -46
- package/dist/wrapper/index.js.map +1 -1
- package/package.json +4 -5
- package/dist/aws-dynamodb/index.d.ts +0 -17
- package/dist/aws-dynamodb/index.d.ts.map +0 -1
- package/dist/aws-dynamodb/index.js +0 -96
- package/dist/aws-dynamodb/index.js.map +0 -1
- package/dist/azure-cosmosdb/index.d.ts +0 -17
- package/dist/azure-cosmosdb/index.d.ts.map +0 -1
- package/dist/azure-cosmosdb/index.js +0 -91
- package/dist/azure-cosmosdb/index.js.map +0 -1
- package/dist/gcp-firestore/index.d.ts +0 -7
- package/dist/gcp-firestore/index.d.ts.map +0 -1
- package/dist/gcp-firestore/index.js +0 -17
- package/dist/gcp-firestore/index.js.map +0 -1
- package/dist/mongo/index.d.ts +0 -7
- package/dist/mongo/index.d.ts.map +0 -1
- package/dist/mongo/index.js +0 -17
- package/dist/mongo/index.js.map +0 -1
- package/dist/types.d.ts +0 -46
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -12
- package/dist/types.js.map +0 -1
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Azure Cosmos DB implementation
|
|
3
|
+
*/
|
|
4
|
+
import { IConnectionForServiceProps, IConnectionResult, IRetrieveResult, ICreateResult, ICreateProps, IRetrieveProps, IQueryProps, IQueryResult, IUpsertProps, IUpsertResult } from '../util';
|
|
5
|
+
/**
|
|
6
|
+
* Create Azure Cosmos DB connection
|
|
7
|
+
* @param props Connection properties with URI and key
|
|
8
|
+
* @returns Promise<IConnectionResult>
|
|
9
|
+
*/
|
|
10
|
+
export declare function connect(props: IConnectionForServiceProps): Promise<IConnectionResult>;
|
|
11
|
+
/**
|
|
12
|
+
* Retrieve document by ID from Azure Cosmos DB
|
|
13
|
+
* @param props Retrieve properties with client, collection (container), and id
|
|
14
|
+
* @returns Promise<IRetrieveResult>
|
|
15
|
+
*/
|
|
16
|
+
export declare function retrieve(props: IRetrieveProps): Promise<IRetrieveResult>;
|
|
17
|
+
export declare function query(props: IQueryProps): Promise<IQueryResult>;
|
|
18
|
+
export declare function create(props: ICreateProps): Promise<ICreateResult>;
|
|
19
|
+
/**
|
|
20
|
+
* Upsert (create or update) a document in Azure Cosmos DB
|
|
21
|
+
* @param props Upsert properties with client, databaseId, containerId, record, and optional partitionKey
|
|
22
|
+
* @returns Promise<IUpsertResult>
|
|
23
|
+
*/
|
|
24
|
+
export declare function upsert(props: IUpsertProps): Promise<IUpsertResult>;
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cosmosdb/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAgB,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAA2B,MAAM,SAAS,CAAC;AAMrO;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAgC3F;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAgD9E;AAGD,wBAAsB,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CA+CrE;AAED,wBAAsB,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAkCxE;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CA2CxE"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Azure Cosmos DB implementation
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.connect = connect;
|
|
7
|
+
exports.retrieve = retrieve;
|
|
8
|
+
exports.query = query;
|
|
9
|
+
exports.create = create;
|
|
10
|
+
exports.upsert = upsert;
|
|
11
|
+
const platform_helper_util_1 = require("@encodeagent/platform-helper-util");
|
|
12
|
+
const util_1 = require("../util");
|
|
13
|
+
const cosmos_1 = require("@azure/cosmos");
|
|
14
|
+
const query_builder_1 = require("./query-builder");
|
|
15
|
+
const ENGINE = "cosmosdb";
|
|
16
|
+
/**
|
|
17
|
+
* Create Azure Cosmos DB connection
|
|
18
|
+
* @param props Connection properties with URI and key
|
|
19
|
+
* @returns Promise<IConnectionResult>
|
|
20
|
+
*/
|
|
21
|
+
async function connect(props) {
|
|
22
|
+
try {
|
|
23
|
+
const { uri, key } = props;
|
|
24
|
+
if (!uri) {
|
|
25
|
+
return {
|
|
26
|
+
engine: ENGINE,
|
|
27
|
+
error: 'Azure Cosmos DB URI is required'
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
if (!key) {
|
|
31
|
+
return {
|
|
32
|
+
engine: ENGINE,
|
|
33
|
+
error: 'Azure Cosmos DB key is required'
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
// Create Azure Cosmos DB client
|
|
37
|
+
const client = new cosmos_1.CosmosClient({ endpoint: uri, key });
|
|
38
|
+
return {
|
|
39
|
+
engine: ENGINE,
|
|
40
|
+
client
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
return {
|
|
45
|
+
engine: ENGINE,
|
|
46
|
+
error: error instanceof Error ? error.message : 'Failed to connect to Azure Cosmos DB'
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Retrieve document by ID from Azure Cosmos DB
|
|
52
|
+
* @param props Retrieve properties with client, collection (container), and id
|
|
53
|
+
* @returns Promise<IRetrieveResult>
|
|
54
|
+
*/
|
|
55
|
+
async function retrieve(props) {
|
|
56
|
+
try {
|
|
57
|
+
const { client, id, partitionKey, databaseId, containerId } = props;
|
|
58
|
+
const errorResult = (0, util_1.validateDatabaseSetting)({
|
|
59
|
+
databaseId,
|
|
60
|
+
containerId,
|
|
61
|
+
checkDatabaseId: true,
|
|
62
|
+
checkContainerId: true
|
|
63
|
+
});
|
|
64
|
+
if (errorResult) {
|
|
65
|
+
return errorResult;
|
|
66
|
+
}
|
|
67
|
+
// Get database and container references
|
|
68
|
+
const database = client.database(databaseId);
|
|
69
|
+
const container = database.container(containerId);
|
|
70
|
+
if ((0, platform_helper_util_1.isNonEmptyString)(partitionKey)) {
|
|
71
|
+
const { resource: item } = await container.item(id, partitionKey).read();
|
|
72
|
+
return {
|
|
73
|
+
engine: ENGINE,
|
|
74
|
+
data: item
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
const iterator = container.items.query({
|
|
79
|
+
query: "SELECT * FROM c WHERE c.id = @id",
|
|
80
|
+
parameters: [{ name: "@id", value: id }],
|
|
81
|
+
}, {
|
|
82
|
+
enableCrossPartitionQuery: true,
|
|
83
|
+
maxItemCount: 1, // fetch small pages; still fan-out under the hood
|
|
84
|
+
});
|
|
85
|
+
const { resources: items /*, headers */ } = await iterator.fetchNext();
|
|
86
|
+
return {
|
|
87
|
+
engine: ENGINE,
|
|
88
|
+
data: items?.[0] ?? null
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
return {
|
|
94
|
+
engine: ENGINE,
|
|
95
|
+
error: error instanceof Error ? error.message : 'Failed to retrieve document from Cosmos DB'
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function query(props) {
|
|
100
|
+
let dbQuery = undefined;
|
|
101
|
+
const { client, databaseId, containerId, query } = props;
|
|
102
|
+
try {
|
|
103
|
+
const errorResult = (0, util_1.validateDatabaseSetting)({
|
|
104
|
+
databaseId,
|
|
105
|
+
containerId,
|
|
106
|
+
checkDatabaseId: true,
|
|
107
|
+
checkContainerId: true
|
|
108
|
+
});
|
|
109
|
+
if (errorResult) {
|
|
110
|
+
return { ...errorResult, query };
|
|
111
|
+
}
|
|
112
|
+
const database = client.database(databaseId);
|
|
113
|
+
const container = database.container(containerId);
|
|
114
|
+
const dbQuery = (0, query_builder_1.processQuery)(query);
|
|
115
|
+
const { sql, parameters } = dbQuery;
|
|
116
|
+
console.log({ query, dbQuery });
|
|
117
|
+
const iterator = container.items.query({ query: sql, parameters }, {
|
|
118
|
+
enableCrossPartitionQuery: true
|
|
119
|
+
});
|
|
120
|
+
const { resources } = await iterator.fetchAll();
|
|
121
|
+
;
|
|
122
|
+
return {
|
|
123
|
+
engine: ENGINE,
|
|
124
|
+
data: resources,
|
|
125
|
+
query,
|
|
126
|
+
dbQuery
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
return {
|
|
131
|
+
engine: ENGINE,
|
|
132
|
+
query,
|
|
133
|
+
dbQuery,
|
|
134
|
+
error: error instanceof Error ? error.message : 'Failed to query documents from Cosmos DB'
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async function create(props) {
|
|
139
|
+
try {
|
|
140
|
+
const { client, databaseId, containerId, record } = props;
|
|
141
|
+
const errorResult = (0, util_1.validateDatabaseSetting)({
|
|
142
|
+
databaseId,
|
|
143
|
+
containerId,
|
|
144
|
+
checkDatabaseId: true,
|
|
145
|
+
checkContainerId: true
|
|
146
|
+
});
|
|
147
|
+
if (errorResult) {
|
|
148
|
+
return errorResult;
|
|
149
|
+
}
|
|
150
|
+
const database = client.database(databaseId);
|
|
151
|
+
const container = database.container(containerId);
|
|
152
|
+
const response = await container.items.create({
|
|
153
|
+
...record,
|
|
154
|
+
id: record.id ?? (0, platform_helper_util_1.newGuid)()
|
|
155
|
+
});
|
|
156
|
+
return {
|
|
157
|
+
engine: ENGINE,
|
|
158
|
+
data: response.resource
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
return {
|
|
163
|
+
engine: ENGINE,
|
|
164
|
+
error: error instanceof Error ? error.message : 'Failed to create record in Cosmos DB'
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Upsert (create or update) a document in Azure Cosmos DB
|
|
170
|
+
* @param props Upsert properties with client, databaseId, containerId, record, and optional partitionKey
|
|
171
|
+
* @returns Promise<IUpsertResult>
|
|
172
|
+
*/
|
|
173
|
+
async function upsert(props) {
|
|
174
|
+
try {
|
|
175
|
+
const { client, databaseId, containerId, record } = props;
|
|
176
|
+
const errorResult = (0, util_1.validateDatabaseSetting)({
|
|
177
|
+
databaseId,
|
|
178
|
+
containerId,
|
|
179
|
+
checkDatabaseId: true,
|
|
180
|
+
checkContainerId: true
|
|
181
|
+
});
|
|
182
|
+
if (errorResult) {
|
|
183
|
+
return errorResult;
|
|
184
|
+
}
|
|
185
|
+
const database = client.database(databaseId);
|
|
186
|
+
const container = database.container(containerId);
|
|
187
|
+
// Ensure the record has an id
|
|
188
|
+
const recordWithId = {
|
|
189
|
+
...record,
|
|
190
|
+
id: record.id ?? (0, platform_helper_util_1.newGuid)()
|
|
191
|
+
};
|
|
192
|
+
// Use upsert operation which creates if not exists or replaces if exists
|
|
193
|
+
const response = await container.items.upsert(recordWithId);
|
|
194
|
+
// Check if this was a new document or an update
|
|
195
|
+
// Cosmos DB doesn't directly tell us, but we can infer from the response
|
|
196
|
+
const isNew = response.statusCode === 201;
|
|
197
|
+
return {
|
|
198
|
+
engine: ENGINE,
|
|
199
|
+
data: response.resource,
|
|
200
|
+
isNew
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
return {
|
|
205
|
+
engine: ENGINE,
|
|
206
|
+
error: error instanceof Error ? error.message : 'Failed to upsert record in Cosmos DB'
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cosmosdb/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-builder.d.ts","sourceRoot":"","sources":["../../src/cosmosdb/query-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA+B,MAAM,SAAS,CAAC;AAE9D,MAAM,WAAW,WAAW;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAE,EAAE,CAAC;CAC9C;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,CA4InD"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.processQuery = processQuery;
|
|
4
|
+
function processQuery(q) {
|
|
5
|
+
let paramCounter = 0;
|
|
6
|
+
const parameters = [];
|
|
7
|
+
const nextParam = (value) => {
|
|
8
|
+
const name = `@p${++paramCounter}`;
|
|
9
|
+
parameters.push({ name, value });
|
|
10
|
+
return name;
|
|
11
|
+
};
|
|
12
|
+
const idf = (field) => field.trim().startsWith("c.") ? field.trim() : `c.${field.trim()}`;
|
|
13
|
+
// Accept both { op: "AND", filters: [...] } and relaxed { op: "AND", [0]: {...}, [1]: {...} }
|
|
14
|
+
const normalizeFilter = (f) => {
|
|
15
|
+
if (!f)
|
|
16
|
+
return undefined;
|
|
17
|
+
if (typeof f.op === "string" &&
|
|
18
|
+
(f.op === "AND" || f.op === "OR" || f.op === "NOT")) {
|
|
19
|
+
const filtersArr = Array.isArray(f.filters)
|
|
20
|
+
? f.filters
|
|
21
|
+
: Object.keys(f)
|
|
22
|
+
.filter((k) => /^\d+$/.test(k))
|
|
23
|
+
.map((k) => f[k]);
|
|
24
|
+
return {
|
|
25
|
+
op: f.op,
|
|
26
|
+
filters: (filtersArr || [])
|
|
27
|
+
.map(normalizeFilter)
|
|
28
|
+
.filter(Boolean),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
// assume simple filter
|
|
32
|
+
return f;
|
|
33
|
+
};
|
|
34
|
+
const buildSimple = (f) => {
|
|
35
|
+
const field = idf(f.name);
|
|
36
|
+
const op = f.op.toUpperCase();
|
|
37
|
+
switch (op) {
|
|
38
|
+
case "IN": {
|
|
39
|
+
const vals = Array.isArray(f.value) ? f.value : [f.value];
|
|
40
|
+
if (vals.length === 0)
|
|
41
|
+
return "1 = 0"; // empty IN -> no matches
|
|
42
|
+
const paramNames = vals.map((v) => nextParam(v));
|
|
43
|
+
return `${field} IN (${paramNames.join(", ")})`;
|
|
44
|
+
}
|
|
45
|
+
case "BETWEEN": {
|
|
46
|
+
const [lo, hi] = Array.isArray(f.value)
|
|
47
|
+
? f.value
|
|
48
|
+
: [undefined, undefined];
|
|
49
|
+
const pLo = nextParam(lo);
|
|
50
|
+
const pHi = nextParam(hi);
|
|
51
|
+
return `${field} BETWEEN ${pLo} AND ${pHi}`;
|
|
52
|
+
}
|
|
53
|
+
case "LIKE": {
|
|
54
|
+
const p = nextParam(f.value);
|
|
55
|
+
return `${field} LIKE ${p}`;
|
|
56
|
+
}
|
|
57
|
+
case "CONTAINS": {
|
|
58
|
+
const p = nextParam(f.value);
|
|
59
|
+
return `CONTAINS(${field}, ${p})`;
|
|
60
|
+
}
|
|
61
|
+
case "STARTSWITH": {
|
|
62
|
+
const p = nextParam(f.value);
|
|
63
|
+
return `STARTSWITH(${field}, ${p})`;
|
|
64
|
+
}
|
|
65
|
+
case "ENDSWITH": {
|
|
66
|
+
const p = nextParam(f.value);
|
|
67
|
+
return `ENDSWITH(${field}, ${p})`;
|
|
68
|
+
}
|
|
69
|
+
default: {
|
|
70
|
+
const p = nextParam(f.value);
|
|
71
|
+
return `${field} ${op} ${p}`;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
const buildFilter = (node) => {
|
|
76
|
+
if (!node)
|
|
77
|
+
return undefined;
|
|
78
|
+
// Group
|
|
79
|
+
if ("filters" in node && "op" in node) {
|
|
80
|
+
const group = node;
|
|
81
|
+
if (group.op === "NOT") {
|
|
82
|
+
const inner = group.filters?.map(buildFilter).filter(Boolean);
|
|
83
|
+
if (!inner || inner.length === 0)
|
|
84
|
+
return undefined;
|
|
85
|
+
return `(NOT (${inner.join(" AND ")}))`;
|
|
86
|
+
}
|
|
87
|
+
const parts = (group.filters || [])
|
|
88
|
+
.map(buildFilter)
|
|
89
|
+
.filter(Boolean);
|
|
90
|
+
if (parts.length === 0)
|
|
91
|
+
return undefined;
|
|
92
|
+
if (parts.length === 1)
|
|
93
|
+
return parts[0];
|
|
94
|
+
return `(${parts.join(` ${group.op} `)})`;
|
|
95
|
+
}
|
|
96
|
+
// Simple
|
|
97
|
+
return buildSimple(node);
|
|
98
|
+
};
|
|
99
|
+
// SELECT
|
|
100
|
+
const cols = q.attributes && q.attributes.length > 0
|
|
101
|
+
? q.attributes.map(idf).join(", ")
|
|
102
|
+
: "c";
|
|
103
|
+
const distinct = q.distinct ? "DISTINCT " : "";
|
|
104
|
+
const top = q.top && q.top > 0 ? `TOP ${q.top} ` : "";
|
|
105
|
+
let sql = `SELECT ${distinct}${top}${cols} FROM c`;
|
|
106
|
+
// WHERE
|
|
107
|
+
const where = buildFilter(normalizeFilter(q.filter));
|
|
108
|
+
if (where)
|
|
109
|
+
sql += ` WHERE ${where}`;
|
|
110
|
+
// ORDER BY
|
|
111
|
+
if (q.orderBy && q.orderBy.length > 0) {
|
|
112
|
+
const parts = q.orderBy.map((o) => `${idf(o.name)} ${o.direction?.toUpperCase() === "DESC" ? "DESC" : "ASC"}`);
|
|
113
|
+
sql += ` ORDER BY ${parts.join(", ")}`;
|
|
114
|
+
}
|
|
115
|
+
// Pagination (Cosmos requires ORDER BY for OFFSET/LIMIT)
|
|
116
|
+
if (q.orderBy && q.orderBy.length > 0 && typeof q.pageSize === "number" && q.pageSize > 0) {
|
|
117
|
+
const page = Math.max(0, q.page ?? 0);
|
|
118
|
+
const offset = page * q.pageSize;
|
|
119
|
+
sql += ` OFFSET ${offset} LIMIT ${q.pageSize}`;
|
|
120
|
+
}
|
|
121
|
+
return { sql, parameters };
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=query-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../../src/cosmosdb/query-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview AWS DynamoDB implementation
|
|
3
|
+
*/
|
|
4
|
+
import { IConnectionForServiceProps, IConnectionResult, IRetrieveResult, IRetrieveProps, ICreateProps, IUpsertProps, IUpsertResult } from '../util';
|
|
5
|
+
/**
|
|
6
|
+
* Create AWS DynamoDB connection
|
|
7
|
+
* @param props Connection properties with URI and key
|
|
8
|
+
* @returns Promise<IConnectionResult>
|
|
9
|
+
*/
|
|
10
|
+
export declare function connect(props: IConnectionForServiceProps): Promise<IConnectionResult>;
|
|
11
|
+
/**
|
|
12
|
+
* Retrieve document by ID from AWS DynamoDB
|
|
13
|
+
* @param props Retrieve properties with client, collection (table), and id
|
|
14
|
+
* @returns Promise<IRetrieveResult<T>>
|
|
15
|
+
*/
|
|
16
|
+
export declare function retrieve<T>(props: IRetrieveProps): Promise<IRetrieveResult<T>>;
|
|
17
|
+
export declare function create<T>(props: ICreateProps): Promise<IRetrieveResult<T>>;
|
|
18
|
+
/**
|
|
19
|
+
* Upsert (create or update) a document in AWS DynamoDB
|
|
20
|
+
* @param props Upsert properties with client, containerId (table name), and record
|
|
21
|
+
* @returns Promise<IUpsertResult<T>>
|
|
22
|
+
*/
|
|
23
|
+
export declare function upsert<T>(props: IUpsertProps): Promise<IUpsertResult<T>>;
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dynamodb/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAiB,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAOnK;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmD3F;AAED;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAkCpF;AAED,wBAAsB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAyChF;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAwD9E"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview AWS DynamoDB implementation
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.connect = connect;
|
|
7
|
+
exports.retrieve = retrieve;
|
|
8
|
+
exports.create = create;
|
|
9
|
+
exports.upsert = upsert;
|
|
10
|
+
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
11
|
+
const util_dynamodb_1 = require("@aws-sdk/util-dynamodb");
|
|
12
|
+
const platform_helper_util_1 = require("@encodeagent/platform-helper-util");
|
|
13
|
+
const ENGINE = "dynamodb";
|
|
14
|
+
/**
|
|
15
|
+
* Create AWS DynamoDB connection
|
|
16
|
+
* @param props Connection properties with URI and key
|
|
17
|
+
* @returns Promise<IConnectionResult>
|
|
18
|
+
*/
|
|
19
|
+
async function connect(props) {
|
|
20
|
+
try {
|
|
21
|
+
const { uri, key } = props;
|
|
22
|
+
if (!uri) {
|
|
23
|
+
return {
|
|
24
|
+
engine: "dynamodb",
|
|
25
|
+
error: 'AWS DynamoDB URI is required'
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (!key) {
|
|
29
|
+
return {
|
|
30
|
+
engine: ENGINE,
|
|
31
|
+
error: 'AWS DynamoDB access key is required'
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
// Parse AWS credentials from key (format: accessKeyId:secretAccessKey)
|
|
35
|
+
const [accessKeyId, secretAccessKey] = key.split(':');
|
|
36
|
+
if (!accessKeyId || !secretAccessKey) {
|
|
37
|
+
return {
|
|
38
|
+
engine: ENGINE,
|
|
39
|
+
error: 'AWS key must be in format: accessKeyId:secretAccessKey'
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// Create DynamoDB client configuration
|
|
43
|
+
const clientConfig = {
|
|
44
|
+
credentials: {
|
|
45
|
+
accessKeyId,
|
|
46
|
+
secretAccessKey
|
|
47
|
+
},
|
|
48
|
+
endpoint: uri.startsWith('http') ? uri : undefined
|
|
49
|
+
};
|
|
50
|
+
// Create AWS DynamoDB client
|
|
51
|
+
const client = new client_dynamodb_1.DynamoDBClient(clientConfig);
|
|
52
|
+
return {
|
|
53
|
+
engine: ENGINE,
|
|
54
|
+
client
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
return {
|
|
59
|
+
engine: ENGINE,
|
|
60
|
+
error: error instanceof Error ? error.message : 'Failed to connect to AWS DynamoDB'
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Retrieve document by ID from AWS DynamoDB
|
|
66
|
+
* @param props Retrieve properties with client, collection (table), and id
|
|
67
|
+
* @returns Promise<IRetrieveResult<T>>
|
|
68
|
+
*/
|
|
69
|
+
async function retrieve(props) {
|
|
70
|
+
try {
|
|
71
|
+
const { client, id, containerId } = props;
|
|
72
|
+
// Create GetItem command
|
|
73
|
+
const command = new client_dynamodb_1.GetItemCommand({
|
|
74
|
+
TableName: containerId,
|
|
75
|
+
Key: (0, util_dynamodb_1.marshall)({ id })
|
|
76
|
+
});
|
|
77
|
+
// Execute the command
|
|
78
|
+
const response = await client.send(command);
|
|
79
|
+
if (!response.Item) {
|
|
80
|
+
return {
|
|
81
|
+
engine: ENGINE,
|
|
82
|
+
error: `Document with ID '${id}' not found in table '${containerId}'`
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// Unmarshall the DynamoDB item to regular object
|
|
86
|
+
const data = (0, util_dynamodb_1.unmarshall)(response.Item);
|
|
87
|
+
return {
|
|
88
|
+
engine: ENGINE,
|
|
89
|
+
data
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
return {
|
|
94
|
+
engine: ENGINE,
|
|
95
|
+
error: error instanceof Error ? error.message : 'Failed to retrieve document from DynamoDB'
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function create(props) {
|
|
100
|
+
try {
|
|
101
|
+
const { client, containerId, record } = props;
|
|
102
|
+
if (!containerId) {
|
|
103
|
+
return {
|
|
104
|
+
engine: ENGINE,
|
|
105
|
+
error: 'The containerId (table name) is required'
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
if (!record) {
|
|
109
|
+
return {
|
|
110
|
+
engine: ENGINE,
|
|
111
|
+
error: 'The record is required'
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const item = {
|
|
115
|
+
...record,
|
|
116
|
+
id: record.id ?? (0, platform_helper_util_1.newGuid)()
|
|
117
|
+
};
|
|
118
|
+
const command = new client_dynamodb_1.PutItemCommand({
|
|
119
|
+
TableName: containerId,
|
|
120
|
+
Item: (0, util_dynamodb_1.marshall)(item)
|
|
121
|
+
});
|
|
122
|
+
await client.send(command);
|
|
123
|
+
return {
|
|
124
|
+
engine: ENGINE,
|
|
125
|
+
data: item
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
return {
|
|
130
|
+
engine: ENGINE,
|
|
131
|
+
error: error instanceof Error ? error.message : 'Failed to create record in DynamoDB'
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Upsert (create or update) a document in AWS DynamoDB
|
|
137
|
+
* @param props Upsert properties with client, containerId (table name), and record
|
|
138
|
+
* @returns Promise<IUpsertResult<T>>
|
|
139
|
+
*/
|
|
140
|
+
async function upsert(props) {
|
|
141
|
+
try {
|
|
142
|
+
const { client, containerId, record } = props;
|
|
143
|
+
if (!containerId) {
|
|
144
|
+
return {
|
|
145
|
+
engine: ENGINE,
|
|
146
|
+
error: 'The containerId (table name) is required'
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
if (!record) {
|
|
150
|
+
return {
|
|
151
|
+
engine: ENGINE,
|
|
152
|
+
error: 'The record is required'
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
// Ensure the record has an id
|
|
156
|
+
const recordWithId = {
|
|
157
|
+
...record,
|
|
158
|
+
id: record.id ?? (0, platform_helper_util_1.newGuid)()
|
|
159
|
+
};
|
|
160
|
+
// Check if the item exists to determine if this is a new record
|
|
161
|
+
let isNew = true;
|
|
162
|
+
if (record.id) {
|
|
163
|
+
const getCommand = new client_dynamodb_1.GetItemCommand({
|
|
164
|
+
TableName: containerId,
|
|
165
|
+
Key: (0, util_dynamodb_1.marshall)({ id: record.id })
|
|
166
|
+
});
|
|
167
|
+
const getResponse = await client.send(getCommand);
|
|
168
|
+
isNew = !getResponse.Item;
|
|
169
|
+
}
|
|
170
|
+
// Use PutItem which will create or replace the item
|
|
171
|
+
const putCommand = new client_dynamodb_1.PutItemCommand({
|
|
172
|
+
TableName: containerId,
|
|
173
|
+
Item: (0, util_dynamodb_1.marshall)(recordWithId)
|
|
174
|
+
});
|
|
175
|
+
await client.send(putCommand);
|
|
176
|
+
return {
|
|
177
|
+
engine: ENGINE,
|
|
178
|
+
data: recordWithId,
|
|
179
|
+
isNew
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
return {
|
|
184
|
+
engine: ENGINE,
|
|
185
|
+
error: error instanceof Error ? error.message : 'Failed to upsert record in DynamoDB'
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dynamodb/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview GCP Firestore implementation
|
|
3
|
+
*/
|
|
4
|
+
import { IConnectionForServiceProps, IConnectionResult, IRetrieveResult, IRetrieveProps, ICreateProps, ICreateResult, IUpsertProps, IUpsertResult } from '../util';
|
|
5
|
+
export declare function connect(props: IConnectionForServiceProps): Promise<IConnectionResult>;
|
|
6
|
+
export declare function retrieve<T>(props: IRetrieveProps): Promise<IRetrieveResult<T>>;
|
|
7
|
+
export declare function create<T>(props: ICreateProps): Promise<ICreateResult<T>>;
|
|
8
|
+
export declare function upsert<T>(props: IUpsertProps): Promise<IUpsertResult<T>>;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/firestore/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAInK,wBAAsB,OAAO,CAAC,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAG3F;AAGD,wBAAsB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAGpF;AAGD,wBAAsB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAgC9E;AAGD,wBAAsB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAgC9E"}
|