mongo-query-dsl 1.0.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.
Files changed (59) hide show
  1. package/README.md +339 -0
  2. package/dist/examples/usage.d.ts +13 -0
  3. package/dist/examples/usage.d.ts.map +1 -0
  4. package/dist/examples/usage.js +162 -0
  5. package/dist/examples/usage.js.map +1 -0
  6. package/dist/src/__tests__/executor.test.d.ts +2 -0
  7. package/dist/src/__tests__/executor.test.d.ts.map +1 -0
  8. package/dist/src/__tests__/executor.test.js +602 -0
  9. package/dist/src/__tests__/executor.test.js.map +1 -0
  10. package/dist/src/__tests__/integration.test.d.ts +2 -0
  11. package/dist/src/__tests__/integration.test.d.ts.map +1 -0
  12. package/dist/src/__tests__/integration.test.js +320 -0
  13. package/dist/src/__tests__/integration.test.js.map +1 -0
  14. package/dist/src/__tests__/parser.test.d.ts +2 -0
  15. package/dist/src/__tests__/parser.test.d.ts.map +1 -0
  16. package/dist/src/__tests__/parser.test.js +320 -0
  17. package/dist/src/__tests__/parser.test.js.map +1 -0
  18. package/dist/src/__tests__/resolver.test.d.ts +2 -0
  19. package/dist/src/__tests__/resolver.test.d.ts.map +1 -0
  20. package/dist/src/__tests__/resolver.test.js +178 -0
  21. package/dist/src/__tests__/resolver.test.js.map +1 -0
  22. package/dist/src/errors.d.ts +26 -0
  23. package/dist/src/errors.d.ts.map +1 -0
  24. package/dist/src/errors.js +44 -0
  25. package/dist/src/errors.js.map +1 -0
  26. package/dist/src/executor.d.ts +32 -0
  27. package/dist/src/executor.d.ts.map +1 -0
  28. package/dist/src/executor.js +214 -0
  29. package/dist/src/executor.js.map +1 -0
  30. package/dist/src/index.d.ts +43 -0
  31. package/dist/src/index.d.ts.map +1 -0
  32. package/dist/src/index.js +120 -0
  33. package/dist/src/index.js.map +1 -0
  34. package/dist/src/parser.d.ts +42 -0
  35. package/dist/src/parser.d.ts.map +1 -0
  36. package/dist/src/parser.js +194 -0
  37. package/dist/src/parser.js.map +1 -0
  38. package/dist/src/resolver.d.ts +22 -0
  39. package/dist/src/resolver.d.ts.map +1 -0
  40. package/dist/src/resolver.js +55 -0
  41. package/dist/src/resolver.js.map +1 -0
  42. package/dist/src/types.d.ts +92 -0
  43. package/dist/src/types.d.ts.map +1 -0
  44. package/dist/src/types.js +3 -0
  45. package/dist/src/types.js.map +1 -0
  46. package/examples/usage.ts +190 -0
  47. package/jest.config.js +13 -0
  48. package/package.json +34 -0
  49. package/src/__tests__/executor.test.ts +694 -0
  50. package/src/__tests__/integration.test.ts +392 -0
  51. package/src/__tests__/parser.test.ts +377 -0
  52. package/src/__tests__/resolver.test.ts +218 -0
  53. package/src/errors.ts +47 -0
  54. package/src/executor.ts +276 -0
  55. package/src/index.ts +118 -0
  56. package/src/parser.ts +216 -0
  57. package/src/resolver.ts +58 -0
  58. package/src/types.ts +107 -0
  59. package/tsconfig.json +30 -0
@@ -0,0 +1,190 @@
1
+ import { NoQL } from "../src/index";
2
+
3
+ /**
4
+ * Example usage of the MongoDB Query DSL
5
+ *
6
+ * This file demonstrates both JSON and DSL query syntax
7
+ *
8
+ * IMPORTANT: This is an example file. To run it, you need:
9
+ * 1. A running MongoDB instance
10
+ * 2. Sample data loaded into your database
11
+ * 3. Update the connection string below
12
+ */
13
+
14
+ async function main() {
15
+ // Connect to MongoDB
16
+ const connectionString =
17
+ process.env.MONGODB_URI || "mongodb://localhost:27017";
18
+ const noql = await NoQL.connect(connectionString);
19
+
20
+ console.log("MongoDB Query DSL Examples\n");
21
+ console.log("=".repeat(50));
22
+
23
+ // Example 1: Simple JSON Query
24
+ console.log("\n1. Simple JSON Query - Get document by _id");
25
+ console.log("-".repeat(50));
26
+
27
+ const jsonQuery1 = {
28
+ output: "value" as const,
29
+ start: {
30
+ collection: "documents",
31
+ db: "myDb",
32
+ where: { _id: "doc_123" },
33
+ },
34
+ steps: [{ type: "get" as const, fields: ["title", "content"] }],
35
+ };
36
+
37
+ const result1 = await noql.executeJson(jsonQuery1);
38
+ console.log("Query:", JSON.stringify(jsonQuery1, null, 2));
39
+ console.log("Result:", JSON.stringify(result1, null, 2));
40
+
41
+ // Example 2: JSON Query with LOOKUP
42
+ console.log("\n2. JSON Query with LOOKUP step");
43
+ console.log("-".repeat(50));
44
+
45
+ const jsonQuery2 = {
46
+ output: "document" as const,
47
+ start: {
48
+ collection: "documents",
49
+ db: "myDb",
50
+ where: { _id: "doc_123" },
51
+ },
52
+ steps: [
53
+ {
54
+ type: "lookup" as const,
55
+ collection: "users",
56
+ db: "myDb",
57
+ by: "userId",
58
+ },
59
+ { type: "get" as const, fields: ["name", "email"] },
60
+ ],
61
+ };
62
+
63
+ const result2 = await noql.executeJson(jsonQuery2);
64
+ console.log("Query:", JSON.stringify(jsonQuery2, null, 2));
65
+ console.log("Result:", JSON.stringify(result2, null, 2));
66
+
67
+ // Example 3: JSON Query with Dynamic Lookups
68
+ console.log("\n3. JSON Query with Dynamic Lookups (using :prefixed values)");
69
+ console.log("-".repeat(50));
70
+
71
+ const jsonQuery3 = {
72
+ output: "trace" as const,
73
+ start: {
74
+ collection: "documents",
75
+ db: "myDb",
76
+ where: { _id: "doc_123" },
77
+ },
78
+ steps: [
79
+ {
80
+ type: "lookup" as const,
81
+ collection: "parentCollection",
82
+ db: "myDb",
83
+ by: "parentId",
84
+ },
85
+ {
86
+ type: "get" as const,
87
+ fields: ["ownerId", "ownerType", "ownerSource"],
88
+ },
89
+ {
90
+ type: "lookup" as const,
91
+ collection: ":ownerType",
92
+ db: ":ownerSource",
93
+ by: "ownerId",
94
+ },
95
+ { type: "get" as const, fields: ["salesId", "name"] },
96
+ ],
97
+ };
98
+
99
+ const result3 = await noql.executeJson(jsonQuery3);
100
+ console.log("Query:", JSON.stringify(jsonQuery3, null, 2));
101
+ console.log("Result:", JSON.stringify(result3, null, 2));
102
+
103
+ // Example 4: DSL Query - Simple
104
+ console.log("\n4. DSL Query - Simple");
105
+ console.log("-".repeat(50));
106
+
107
+ const dslQuery1 = `
108
+ FROM documents IN myDb WHERE _id = "doc_123"
109
+ -> GET title, content
110
+ `.trim();
111
+
112
+ const result4 = await noql.executeDSL(dslQuery1);
113
+ console.log("DSL:", dslQuery1);
114
+ console.log("Result:", JSON.stringify(result4, null, 2));
115
+
116
+ // Example 5: DSL Query - With LOOKUP
117
+ console.log("\n5. DSL Query - With LOOKUP");
118
+ console.log("-".repeat(50));
119
+
120
+ const dslQuery2 = `
121
+ FROM documents IN myDb WHERE _id = "doc_123"
122
+ -> LOOKUP users IN myDb BY userId
123
+ -> GET name, email
124
+ `.trim();
125
+
126
+ const result5 = await noql.executeDSL(dslQuery2);
127
+ console.log("DSL:", dslQuery2);
128
+ console.log("Result:", JSON.stringify(result5, null, 2));
129
+
130
+ // Example 6: DSL Query - With Dynamic Lookups and Trace
131
+ console.log("\n6. DSL Query - With Dynamic Lookups and Trace");
132
+ console.log("-".repeat(50));
133
+
134
+ const dslQuery3 = `
135
+ WITH output: "trace"
136
+ FROM documents IN myDb WHERE _id = "doc_123"
137
+ -> LOOKUP parentCollection IN myDb BY parentId
138
+ -> GET ownerId, ownerType, ownerSource
139
+ -> LOOKUP :ownerType IN :ownerSource BY ownerId
140
+ -> GET salesId, name
141
+ `.trim();
142
+
143
+ const result6 = await noql.executeDSL(dslQuery3);
144
+ console.log("DSL:", dslQuery3);
145
+ console.log("Result:", JSON.stringify(result6, null, 2));
146
+
147
+ // Example 7: DSL Query - With WHERE conditions
148
+ console.log("\n7. DSL Query - With WHERE conditions in LOOKUP");
149
+ console.log("-".repeat(50));
150
+
151
+ const dslQuery4 = `
152
+ FROM documents IN myDb WHERE _id = "doc_123"
153
+ -> LOOKUP users IN myDb BY userId WHERE status = "active" AND verified = true
154
+ -> GET name, email
155
+ `.trim();
156
+
157
+ const result7 = await noql.executeDSL(dslQuery4);
158
+ console.log("DSL:", dslQuery4);
159
+ console.log("Result:", JSON.stringify(result7, null, 2));
160
+
161
+ // Example 8: Parse DSL without executing
162
+ console.log("\n8. Parse DSL (without executing)");
163
+ console.log("-".repeat(50));
164
+
165
+ const dslToParse = `
166
+ WITH output: "document"
167
+ FROM documents IN myDb WHERE _id = "doc_123"
168
+ -> LOOKUP users IN myDb BY userId
169
+ -> GET name, email
170
+ `.trim();
171
+
172
+ const parsedQuery = noql.parseDSL(dslToParse);
173
+ console.log("DSL:", dslToParse);
174
+ console.log("Parsed to JSON:", JSON.stringify(parsedQuery, null, 2));
175
+
176
+ // Close connection
177
+ await noql.close();
178
+ console.log("\n" + "=".repeat(50));
179
+ console.log("Connection closed");
180
+ }
181
+
182
+ // Run examples
183
+ if (require.main === module) {
184
+ main().catch((error) => {
185
+ console.error("Error running examples:", error);
186
+ process.exit(1);
187
+ });
188
+ }
189
+
190
+ export { main };
package/jest.config.js ADDED
@@ -0,0 +1,13 @@
1
+ module.exports = {
2
+ preset: 'ts-jest',
3
+ testEnvironment: 'node',
4
+ roots: ['<rootDir>/src'],
5
+ testMatch: ['**/__tests__/**/*.test.ts'],
6
+ collectCoverageFrom: [
7
+ 'src/**/*.ts',
8
+ '!src/**/*.d.ts',
9
+ '!src/examples/**',
10
+ ],
11
+ coverageDirectory: 'coverage',
12
+ coverageReporters: ['text', 'lcov', 'html'],
13
+ };
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "mongo-query-dsl",
3
+ "version": "1.0.0",
4
+ "description": "A domain-specific language (DSL) for traversing and querying MongoDB documents with dynamic lookups",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "dev": "tsc --watch",
10
+ "example": "npm run build && node dist/examples/usage.js",
11
+ "test": "jest",
12
+ "test:watch": "jest --watch",
13
+ "test:coverage": "jest --coverage"
14
+ },
15
+ "keywords": [
16
+ "mongodb",
17
+ "dsl",
18
+ "query",
19
+ "lookup",
20
+ "traverse"
21
+ ],
22
+ "author": "",
23
+ "license": "MIT",
24
+ "dependencies": {
25
+ "mongodb": "^6.3.0"
26
+ },
27
+ "devDependencies": {
28
+ "@types/jest": "^30.0.0",
29
+ "@types/node": "^20.10.0",
30
+ "jest": "^30.2.0",
31
+ "ts-jest": "^29.4.6",
32
+ "typescript": "^5.3.0"
33
+ }
34
+ }