nodester 0.4.5 → 0.4.7

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.
@@ -13,6 +13,10 @@ const { decodeQueryString } = require('./decoder');
13
13
  const QueryLexer = require('./interpreter/QueryLexer');
14
14
  const { createErrorResponse } = require('nodester/factories/responses/rest');
15
15
 
16
+ const {
17
+ AST_ModelsTree
18
+ } = require('nodester/tools/nql');
19
+
16
20
 
17
21
  module.exports = function initNodesterQL() {
18
22
  return nqlHandle;
@@ -38,6 +42,10 @@ function nqlHandle(req, res, next) {
38
42
  const decoded = decodeQueryString(queryString);
39
43
  const lexer = new QueryLexer(decoded);
40
44
 
45
+ console.log(
46
+ AST_ModelsTree(lexer.tree)
47
+ );
48
+
41
49
  // Go on!
42
50
  req.nquery = lexer.query;
43
51
  return next();
@@ -289,7 +289,7 @@ module.exports = class QueryLexer {
289
289
  debug('char', char, { token, node: tree.node });
290
290
 
291
291
  // Vertical include:
292
- if (!!previousActive) {
292
+ if (!!previousActive && token.length === 0) {
293
293
  tree.use(previousActive);
294
294
  tree.node.activeParam = PARAM_TOKENS.INCLUDES;
295
295
  token = '';
@@ -403,7 +403,7 @@ function _traverseIncludedOrders(resultQuery, rootModel) {
403
403
 
404
404
  const { association } = include;
405
405
  const {
406
- // associatedModel,
406
+ associatedModel,
407
407
  associationType
408
408
  } = getModelAssociationProps(rootModel.associations[association]);
409
409
 
@@ -42,13 +42,17 @@ function _AST_ModelsTreeNode(node, spacing=0) {
42
42
  ast += `${ spaces }┣ model: ${ node.model }\n`;
43
43
  ast += `${ spaces }┃\n`;
44
44
 
45
+ if (!!node.fields) {
45
46
  ast += `${ spaces }┣ fields (${ node.fields.length }): [\n${ node.fields.map(f => ` • ${ f },\n`) }`;
46
47
  ast += `${ spaces }┃ ]\n`;
47
48
  ast += `${ spaces }┃\n`;
49
+ }
48
50
 
51
+ if (!!node.functions) {
49
52
  ast += `${ spaces }┣ functions (${ node.functions.length }): [\n${ node.functions.map(f => ` • ${ f },\n`) }`;
50
53
  ast += `${ spaces }┃ ]\n`;
51
54
  ast += `${ spaces }┃\n`;
55
+ }
52
56
 
53
57
  ast += `${ spaces }┣ where: ${ JSON.stringify(node.where) }\n`;
54
58
  ast += `${ spaces }┃\n`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodester",
3
- "version": "0.4.5",
3
+ "version": "0.4.7",
4
4
  "description": "A versatile REST framework for Node.js",
5
5
  "directories": {
6
6
  "docs": "docs",
@@ -65,6 +65,8 @@
65
65
  "./stacks/markers": "./lib/stacks/MarkersStack.js",
66
66
  "./stacks/middlewares": "./lib/stacks/MiddlewaresStack.js",
67
67
 
68
+ "./tools/nql": "./lib/tools/nql.tool.js",
69
+
68
70
  "./utils/dates": "./lib/utils/dates.js",
69
71
  "./utils/sql": "./lib/utils/sql.util.js",
70
72
  "./utils/strings": "./lib/utils/strings.util.js",
@@ -7,7 +7,7 @@ const {
7
7
  } = require('@jest/globals');
8
8
 
9
9
  // Configs.
10
- const PORT = 8080;
10
+ const PORT = 8100;
11
11
 
12
12
  // Our lib.
13
13
  const Nodester = require('../lib/application');
package/tests/nql.test.js CHANGED
@@ -64,26 +64,30 @@ describe('nodester Query Language', () => {
64
64
  });
65
65
 
66
66
  describe('includes', () => {
67
- const queryStrings = [
67
+ const queryStrings = {
68
68
  // Simple includes.
69
- 'includes=comments&id=7',
70
- // Include with All possible params.
71
- 'includes=comments(id=10&position=4&limit=3&skip=10&order=desc&order_by=index&a=id,content,position)',
72
-
73
- // 2 horizontals
74
- 'includes=comments,users&id=1000',
69
+ 'simple-includes': 'includes=comments&id=7',
70
+ // Include with params.
71
+ 'include-with-params': 'includes=comments(id=10&position=4&limit=3&skip=10&order=desc&order_by=index&a=id,content,position)',
72
+
73
+ // 2 horizontals.
74
+ '2-horizontals': 'includes=comments,users&id=1000',
75
+ // 4 horizontals with subquery.
76
+ '4-horizontals': 'in=categories,replies.users,comments(order_by=position&order=desc),users.avatars',
75
77
 
76
78
  // Horizontals queried.
77
- 'includes=comments(order=desc),users,likes(order=rand),reposts&id=1000',
79
+ 'horizontals-queried': 'includes=comments(order=desc),users,likes(order=rand),reposts&id=1000',
78
80
  // Horizontals queried №2.
79
- 'in=comments(order_by=index&order=asc).users.karma',
81
+ 'horizontals-queried-2': 'in=comments(order_by=index&order=asc).users.karma',
80
82
  // Horizontals queried №3.
81
- 'in=reactions,comments(user_id=gte(4)&skip=10&limit=2).users,likes,reposts',
82
- 'includes=comments(order=rand)&id=7&limit=3&includes=users(a=id,content)',
83
- ];
83
+ 'horizontals-queried-3': 'in=reactions,comments(user_id=gte(4)&skip=10&limit=2).users,likes,reposts',
84
+
85
+ // Separated includes.
86
+ 'separated-includes': 'includes=comments(order=rand)&id=7&limit=3&includes=users(a=id,content)',
87
+ };
84
88
 
85
89
  test('Simple includes', () => {
86
- const lexer = new QueryLexer( queryStrings[0] );
90
+ const lexer = new QueryLexer( queryStrings['simple-includes'] );
87
91
  const result = lexer.query;
88
92
 
89
93
 
@@ -96,7 +100,7 @@ describe('nodester Query Language', () => {
96
100
  });
97
101
 
98
102
  test('Include with all possible params', () => {
99
- const lexer = new QueryLexer( queryStrings[1] );
103
+ const lexer = new QueryLexer( queryStrings['include-with-params'] );
100
104
  const result = lexer.query;
101
105
 
102
106
  const tree = new ModelsTree();
@@ -113,7 +117,7 @@ describe('nodester Query Language', () => {
113
117
  });
114
118
 
115
119
  test('2 horizontals', () => {
116
- const lexer = new QueryLexer( queryStrings[2] );
120
+ const lexer = new QueryLexer( queryStrings['2-horizontals'] );
117
121
  const result = lexer.query;
118
122
 
119
123
 
@@ -126,8 +130,39 @@ describe('nodester Query Language', () => {
126
130
  expect(result).toMatchObject(expected);
127
131
  });
128
132
 
133
+ test('4 horizontals', () => {
134
+ // in=categories,replies.users,comments(order_by=position&order=desc),users.avatars
135
+
136
+ const lexer = new QueryLexer( queryStrings['4-horizontals'] );
137
+ const result = lexer.query;
138
+
139
+
140
+ const tree = new ModelsTree();
141
+ tree.include('categories');
142
+ tree.include('replies');
143
+ tree.include('comments');
144
+ tree.include('users');
145
+
146
+ tree.use('replies');
147
+ tree.include('users');
148
+
149
+ tree.up();
150
+
151
+ tree.use('comments');
152
+ tree.node.order = 'desc';
153
+ tree.node.order_by = 'position';
154
+
155
+ tree.up();
156
+ tree.use('users');
157
+ tree.include('avatars');
158
+
159
+ const expected = tree.root.toObject();
160
+
161
+ expect(result).toMatchObject(expected);
162
+ });
163
+
129
164
  test('Horizontals queried', () => {
130
- const lexer = new QueryLexer( queryStrings[3] );
165
+ const lexer = new QueryLexer( queryStrings['horizontals-queried'] );
131
166
  const result = lexer.query;
132
167
 
133
168
 
@@ -147,7 +182,7 @@ describe('nodester Query Language', () => {
147
182
  });
148
183
 
149
184
  test('Horizontals queried №2', () => {
150
- const lexer = new QueryLexer( queryStrings[4] );
185
+ const lexer = new QueryLexer( queryStrings['horizontals-queried-2'] );
151
186
  const result = lexer.query;
152
187
 
153
188
  const tree = new ModelsTree();
@@ -165,7 +200,7 @@ describe('nodester Query Language', () => {
165
200
  });
166
201
 
167
202
  test('Horizontals queried №3', () => {
168
- const lexer = new QueryLexer( queryStrings[5] );
203
+ const lexer = new QueryLexer( queryStrings['horizontals-queried-3'] );
169
204
  const result = lexer.query;
170
205
 
171
206
  const tree = new ModelsTree();
@@ -192,7 +227,7 @@ describe('nodester Query Language', () => {
192
227
  });
193
228
 
194
229
  test('Separated includes"', () => {
195
- const lexer = new QueryLexer( queryStrings[6] );
230
+ const lexer = new QueryLexer( queryStrings['separated-includes'] );
196
231
  const result = lexer.query;
197
232
 
198
233
  const tree = new ModelsTree();