happy-sql 1.4.0 → 1.5.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/ChangeLog +8 -0
- package/lib/parser/visitors/clause/delete/delete.js +1 -1
- package/lib/parser/visitors/clause/delete/fixture/delete-fix.js +1 -1
- package/lib/parser/visitors/clause/from/fixture/join-fix.js +6 -0
- package/lib/parser/visitors/clause/from/fixture/join-multi-fix.js +6 -0
- package/lib/parser/visitors/clause/from/fixture/join-multi.sql +1 -0
- package/lib/parser/visitors/clause/from/fixture/join.sql +1 -0
- package/lib/parser/visitors/clause/from/from.js +79 -3
- package/lib/parser/visitors/clause/operand.js +4 -0
- package/lib/parser/visitors/clause/select/select.js +4 -0
- package/lib/parser/visitors/clause/where/where.js +6 -17
- package/lib/printer/fixture/select.js +3 -0
- package/lib/printer/visitors/call-expression/clauses/as/as.js +11 -2
- package/lib/printer/visitors/call-expression/clauses/clauses.js +6 -2
- package/lib/printer/visitors/call-expression/clauses/count/fixture/count-fix.sql +2 -0
- package/lib/printer/visitors/call-expression/clauses/count/fixture/count-one-fix.js +3 -0
- package/lib/printer/visitors/call-expression/clauses/count/fixture/count-one.js +1 -0
- package/lib/printer/visitors/call-expression/clauses/count/fixture/count.js +1 -0
- package/lib/printer/visitors/call-expression/clauses/create-table/fixture/createTable.js +5 -0
- package/lib/printer/visitors/call-expression/clauses/create-table/fixture/createTableSerial.js +5 -0
- package/lib/printer/visitors/call-expression/clauses/delete/delete.js +1 -1
- package/lib/printer/visitors/call-expression/clauses/delete/fixture/delete.js +3 -0
- package/lib/printer/visitors/call-expression/clauses/from/fixture/from-fix.js +3 -0
- package/lib/printer/visitors/call-expression/clauses/from/fixture/from.js +1 -0
- package/lib/printer/visitors/call-expression/clauses/from/from.js +4 -0
- package/lib/printer/visitors/call-expression/clauses/insert/fixture/insert.js +3 -0
- package/lib/printer/visitors/call-expression/clauses/into/fixture/into-fix.js +3 -0
- package/lib/printer/visitors/call-expression/clauses/into/fixture/into.js +1 -0
- package/lib/printer/visitors/call-expression/clauses/into/fixture/single-column-fix.js +3 -0
- package/lib/printer/visitors/call-expression/clauses/into/fixture/single-column-fix.sql +1 -0
- package/lib/printer/visitors/call-expression/clauses/into/fixture/single-column.js +3 -0
- package/lib/printer/visitors/call-expression/clauses/join/fixture/join-fix.sql +4 -0
- package/lib/printer/visitors/call-expression/clauses/join/fixture/join-multi-fix.sql +4 -0
- package/lib/printer/visitors/call-expression/clauses/join/fixture/join-multi.js +1 -0
- package/lib/printer/visitors/call-expression/clauses/join/fixture/join.js +1 -0
- package/lib/printer/visitors/call-expression/clauses/join/join.js +8 -0
- package/lib/printer/visitors/call-expression/clauses/last-insert-rowid/fixture/lastInsertRowid.js +3 -0
- package/lib/printer/visitors/call-expression/clauses/lastval/fixture/lastval.js +3 -0
- package/lib/printer/visitors/call-expression/clauses/on/on.js +4 -0
- package/lib/printer/visitors/call-expression/clauses/on-conflict/fixture/on-conflict-multi.js +3 -0
- package/lib/printer/visitors/call-expression/clauses/on-conflict/fixture/on-conflict.js +3 -0
- package/lib/printer/visitors/call-expression/clauses/returning/fixture/returning-conflict.js +3 -0
- package/lib/printer/visitors/call-expression/clauses/returning/fixture/returning-id.js +7 -0
- package/lib/printer/visitors/call-expression/clauses/returning/fixture/returning-multi.js +3 -0
- package/lib/printer/visitors/call-expression/clauses/returning/fixture/returning.js +7 -0
- package/lib/printer/visitors/call-expression/clauses/section/fixture/section-multi.js +6 -0
- package/lib/printer/visitors/call-expression/clauses/section/fixture/section.js +3 -0
- package/lib/printer/visitors/call-expression/clauses/select/fixture/select.js +3 -0
- package/lib/printer/visitors/call-expression/clauses/select/fixture/string.js +3 -0
- package/lib/printer/visitors/call-expression/clauses/update/fixture/update.js +3 -0
- package/lib/printer/visitors/call-expression/clauses/where/fixture/where.js +3 -0
- package/lib/printer/visitors/call-expression/clauses/with-named/fixture/withNamed.js +11 -0
- package/lib/printer/visitors/index.js +2 -0
- package/lib/printer/visitors/member-expression.js +5 -0
- package/package.json +13 -13
- /package/lib/printer/visitors/call-expression/clauses/count/fixture/{count.sql → count-fix.js} +0 -0
- /package/lib/printer/visitors/call-expression/clauses/count/fixture/{count-one.sql → count-one-fix.sql} +0 -0
- /package/lib/printer/visitors/call-expression/clauses/create-table/fixture/{createTable.sql → createTable-fix.sql} +0 -0
- /package/lib/printer/visitors/call-expression/clauses/create-table/fixture/{createTableSerial.sql → createTableSerial-fix.sql} +0 -0
- /package/lib/printer/visitors/call-expression/clauses/delete/fixture/{delete.sql → delete-fix.sql} +0 -0
- /package/lib/printer/visitors/call-expression/clauses/last-insert-rowid/fixture/{lastInsertRowid.sql → lastInsertRowid-fix.sql} +0 -0
- /package/lib/printer/visitors/call-expression/clauses/lastval/fixture/{lastval.sql → lastval-fix.sql} +0 -0
- /package/lib/printer/visitors/call-expression/clauses/on-conflict/fixture/{on-conflict.sql → on-conflict-fix.sql} +0 -0
- /package/lib/printer/visitors/call-expression/clauses/on-conflict/fixture/{on-conflict-multi.sql → on-conflict-multi-fix.sql} +0 -0
- /package/lib/printer/visitors/call-expression/clauses/select/fixture/{select.sql → select-fix.sql} +0 -0
- /package/lib/printer/visitors/call-expression/clauses/select/fixture/{string.sql → string-fix.sql} +0 -0
package/ChangeLog
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
SELECT bin.id, arg_id.name FROM BinaryExpression bin JOIN Identifier nan_id ON nan_id.parent_id = bin.id JOIN Identifier arg_id ON arg_id.parent_id = bin.id
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
SELECT bin.id FROM BinaryExpression bin JOIN Identifier nan_id ON nan_id.parent_id = bin.id AND nan_id.name = 'NaN'
|
|
@@ -1,7 +1,83 @@
|
|
|
1
1
|
import {types} from '@putout/babel';
|
|
2
2
|
|
|
3
|
-
const {
|
|
3
|
+
const {
|
|
4
|
+
identifier,
|
|
5
|
+
callExpression,
|
|
6
|
+
memberExpression,
|
|
7
|
+
binaryExpression,
|
|
8
|
+
logicalExpression,
|
|
9
|
+
stringLiteral,
|
|
10
|
+
numericLiteral,
|
|
11
|
+
} = types;
|
|
4
12
|
|
|
5
|
-
|
|
6
|
-
|
|
13
|
+
const convertOperand = (node) => {
|
|
14
|
+
if (node.type === 'member_expr')
|
|
15
|
+
return memberExpression(identifier(node.object.name), identifier(node.property.name));
|
|
16
|
+
|
|
17
|
+
if (node.type === 'parameter')
|
|
18
|
+
return stringLiteral(node.text);
|
|
19
|
+
|
|
20
|
+
if (node.type === 'number_literal')
|
|
21
|
+
return numericLiteral(node.value);
|
|
22
|
+
|
|
23
|
+
if (node.type === 'string_literal')
|
|
24
|
+
return stringLiteral(node.value);
|
|
25
|
+
|
|
26
|
+
return identifier(node.name);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const convertCondition = (node) => {
|
|
30
|
+
if (node.operator?.name === 'AND')
|
|
31
|
+
return logicalExpression('&&', convertCondition(node.left), convertCondition(node.right));
|
|
32
|
+
|
|
33
|
+
if (node.operator?.name === 'OR')
|
|
34
|
+
return logicalExpression('||', convertCondition(node.left), convertCondition(node.right));
|
|
35
|
+
|
|
36
|
+
return binaryExpression('===', convertOperand(node.left), convertOperand(node.right));
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const convertOn = (spec) => callExpression(identifier('on'), [
|
|
40
|
+
convertCondition(spec.expr),
|
|
7
41
|
]);
|
|
42
|
+
|
|
43
|
+
const convertAlias = (node) => {
|
|
44
|
+
if (node.type === 'alias')
|
|
45
|
+
return callExpression(identifier('as'), [
|
|
46
|
+
identifier(node.expr.name),
|
|
47
|
+
identifier(node.alias.name),
|
|
48
|
+
]);
|
|
49
|
+
|
|
50
|
+
return identifier(node.name);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const flattenJoins = (node, joins = []) => {
|
|
54
|
+
if (node.type === 'join_expr') {
|
|
55
|
+
flattenJoins(node.left, joins);
|
|
56
|
+
joins.push(callExpression(identifier('join'), [
|
|
57
|
+
convertAlias(node.right),
|
|
58
|
+
convertOn(node.specification),
|
|
59
|
+
]));
|
|
60
|
+
|
|
61
|
+
return joins;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
joins.unshift(convertAlias(node));
|
|
65
|
+
|
|
66
|
+
return joins;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export const convertFrom = ({expr}) => {
|
|
70
|
+
if (expr.type === 'join_expr') {
|
|
71
|
+
const parts = flattenJoins(expr);
|
|
72
|
+
return callExpression(identifier('from'), parts);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (expr.type === 'alias')
|
|
76
|
+
return callExpression(identifier('from'), [
|
|
77
|
+
convertAlias(expr),
|
|
78
|
+
]);
|
|
79
|
+
|
|
80
|
+
return callExpression(identifier('from'), [
|
|
81
|
+
identifier(expr.name),
|
|
82
|
+
]);
|
|
83
|
+
};
|
|
@@ -4,9 +4,13 @@ const {
|
|
|
4
4
|
identifier,
|
|
5
5
|
stringLiteral,
|
|
6
6
|
numericLiteral,
|
|
7
|
+
memberExpression,
|
|
7
8
|
} = types;
|
|
8
9
|
|
|
9
10
|
export const convertOperand = (node) => {
|
|
11
|
+
if (node.type === 'member_expr')
|
|
12
|
+
return memberExpression(identifier(node.object.name), identifier(node.property.name));
|
|
13
|
+
|
|
10
14
|
if (node.type === 'parameter')
|
|
11
15
|
return stringLiteral(node.text);
|
|
12
16
|
|
|
@@ -10,6 +10,7 @@ const {
|
|
|
10
10
|
stringLiteral,
|
|
11
11
|
assignmentExpression,
|
|
12
12
|
callExpression,
|
|
13
|
+
memberExpression,
|
|
13
14
|
} = types;
|
|
14
15
|
|
|
15
16
|
const convertColumn = (column) => {
|
|
@@ -25,6 +26,9 @@ const convertColumn = (column) => {
|
|
|
25
26
|
if (column.type === 'string_literal')
|
|
26
27
|
return stringLiteral(column.value);
|
|
27
28
|
|
|
29
|
+
if (column.type === 'member_expr')
|
|
30
|
+
return memberExpression(identifier(column.object.name), identifier(column.property.name));
|
|
31
|
+
|
|
28
32
|
return identifier(column.name);
|
|
29
33
|
};
|
|
30
34
|
|
|
@@ -1,30 +1,19 @@
|
|
|
1
1
|
import {types} from '@putout/babel';
|
|
2
|
+
import {convertOperand} from '#parser/clause/operand';
|
|
2
3
|
|
|
3
4
|
const {
|
|
4
|
-
binaryExpression,
|
|
5
5
|
logicalExpression,
|
|
6
6
|
identifier,
|
|
7
|
-
stringLiteral,
|
|
8
|
-
numericLiteral,
|
|
9
7
|
callExpression,
|
|
10
8
|
} = types;
|
|
11
9
|
|
|
12
|
-
const convertOperand = (node) => {
|
|
13
|
-
if (node.type === 'parameter')
|
|
14
|
-
return stringLiteral(node.text);
|
|
15
|
-
|
|
16
|
-
if (node.type === 'number_literal')
|
|
17
|
-
return numericLiteral(node.value);
|
|
18
|
-
|
|
19
|
-
if (node.type === 'string_literal')
|
|
20
|
-
return stringLiteral(node.value);
|
|
21
|
-
|
|
22
|
-
return identifier(node.name);
|
|
23
|
-
};
|
|
24
|
-
|
|
25
10
|
const convertAnd = (node) => logicalExpression('&&', convertCondition(node.left), convertCondition(node.right));
|
|
26
11
|
const convertOr = (node) => logicalExpression('||', convertCondition(node.left), convertCondition(node.right));
|
|
27
|
-
|
|
12
|
+
|
|
13
|
+
const convertEq = (node) => {
|
|
14
|
+
const {binaryExpression} = types;
|
|
15
|
+
return binaryExpression('===', convertOperand(node.left), convertOperand(node.right));
|
|
16
|
+
};
|
|
28
17
|
|
|
29
18
|
const convertCondition = (node) => {
|
|
30
19
|
if (node.operator?.name === 'AND')
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
export const as = (path, {write, traverse}) => {
|
|
2
2
|
const [column, alias] = path.get('arguments');
|
|
3
|
+
|
|
3
4
|
traverse(column);
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
if (alias.node.type === 'StringLiteral') {
|
|
7
|
+
write(' AS ');
|
|
8
|
+
write(alias.node.value);
|
|
9
|
+
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
write(' ');
|
|
14
|
+
traverse(alias);
|
|
6
15
|
};
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import {join} from './join/join.js';
|
|
2
|
+
import {on} from './on/on.js';
|
|
1
3
|
import {select} from './select/select.js';
|
|
2
4
|
import {from} from './from/from.js';
|
|
3
5
|
import {where} from './where/where.js';
|
|
@@ -7,7 +9,7 @@ import {values} from './values/values.js';
|
|
|
7
9
|
import {onConflict} from './on-conflict/on-conflict.js';
|
|
8
10
|
import {update} from './update/update.js';
|
|
9
11
|
import {set} from './set/set.js';
|
|
10
|
-
import {
|
|
12
|
+
import {deleteFrom} from './delete/delete.js';
|
|
11
13
|
import {section} from './section/section.js';
|
|
12
14
|
import {count} from './count/count.js';
|
|
13
15
|
import {returning} from './returning/returning.js';
|
|
@@ -22,6 +24,8 @@ import {lastInsertRowid} from './last-insert-rowid/last-insert-rowid.js';
|
|
|
22
24
|
import {lastval} from './lastval/lastval.js';
|
|
23
25
|
|
|
24
26
|
export const clauses = {
|
|
27
|
+
join,
|
|
28
|
+
on,
|
|
25
29
|
count,
|
|
26
30
|
from,
|
|
27
31
|
select,
|
|
@@ -32,7 +36,7 @@ export const clauses = {
|
|
|
32
36
|
onConflict,
|
|
33
37
|
update,
|
|
34
38
|
set,
|
|
35
|
-
|
|
39
|
+
deleteFrom,
|
|
36
40
|
section,
|
|
37
41
|
returning,
|
|
38
42
|
as,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
select(count(1), from(users));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
select(count('*'), from(users));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
select('*', from(users));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
insert(into(t, x), values(':x'));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
INSERT INTO t (x) VALUES (:x)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[select(bin.id, arg_id.name, from(as(BinaryExpression, bin), join(as(Identifier, nan_id), on(nan_id.parent_id === bin.id)), join(as(Identifier, arg_id), on(arg_id.parent_id === bin.id))))];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
[select(bin.id, from(as(BinaryExpression, bin), join(as(Identifier, nan_id), on(nan_id.parent_id === bin.id && nan_id.name === 'NaN'))))];
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
[
|
|
2
|
+
withNamed(call = insert(into(
|
|
3
|
+
CallExpression,
|
|
4
|
+
parent_id,
|
|
5
|
+
values(':parent_id'),
|
|
6
|
+
), returning(id)), member = insert(into(
|
|
7
|
+
MemberExpression,
|
|
8
|
+
parent_id,
|
|
9
|
+
select(id, from(call)),
|
|
10
|
+
), returning(id)), insert(into(Identifier, [name, parent_id], select('x', id, from(member))))),
|
|
11
|
+
];
|
|
@@ -5,6 +5,7 @@ import {ArrayExpression} from './array-expression.js';
|
|
|
5
5
|
import {BinaryExpression} from './binary-expression.js';
|
|
6
6
|
import {LogicalExpression} from './logical-expression.js';
|
|
7
7
|
import {AssignmentExpression} from './assignment-expression.js';
|
|
8
|
+
import {MemberExpression} from './member-expression.js';
|
|
8
9
|
|
|
9
10
|
export const visitors = {
|
|
10
11
|
ArrayExpression,
|
|
@@ -14,4 +15,5 @@ export const visitors = {
|
|
|
14
15
|
BinaryExpression,
|
|
15
16
|
LogicalExpression,
|
|
16
17
|
AssignmentExpression,
|
|
18
|
+
MemberExpression,
|
|
17
19
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "happy-sql",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "sql to js ast parser and printer",
|
|
6
6
|
"exports": {
|
|
@@ -64,24 +64,24 @@
|
|
|
64
64
|
},
|
|
65
65
|
"homepage": "https://github.com/coderaiser/happy-sql",
|
|
66
66
|
"devDependencies": {
|
|
67
|
-
"@putout/plugin-printer": "^8.
|
|
68
|
-
"@putout/test": "^15.
|
|
69
|
-
"eslint": "^10.
|
|
70
|
-
"eslint-plugin-node": "^11.
|
|
71
|
-
"eslint-plugin-putout": "^31.
|
|
67
|
+
"@putout/plugin-printer": "^8.22.0",
|
|
68
|
+
"@putout/test": "^15.8.2",
|
|
69
|
+
"eslint": "^10.8.1",
|
|
70
|
+
"eslint-plugin-node": "^11.1.0",
|
|
71
|
+
"eslint-plugin-putout": "^31.4.2",
|
|
72
72
|
"just-kebab-case": "^4.2.0",
|
|
73
|
-
"madrun": "^13.0.
|
|
73
|
+
"madrun": "^13.0.4",
|
|
74
74
|
"montag": "^2.0.1",
|
|
75
|
-
"nodemon": "^3.1.
|
|
76
|
-
"putout": "^42.
|
|
75
|
+
"nodemon": "^3.1.14",
|
|
76
|
+
"putout": "^42.11.0",
|
|
77
77
|
"redlint": "^6.9.2",
|
|
78
78
|
"superc8": "^12.7.0",
|
|
79
|
-
"supertape": "^13.
|
|
79
|
+
"supertape": "^13.5.1"
|
|
80
80
|
},
|
|
81
81
|
"dependencies": {
|
|
82
|
-
"@putout/babel": "^5.
|
|
83
|
-
"@putout/operator-json": "^3.
|
|
84
|
-
"@putout/printer": "^18.
|
|
82
|
+
"@putout/babel": "^5.9.9",
|
|
83
|
+
"@putout/operator-json": "^3.5.0",
|
|
84
|
+
"@putout/printer": "^18.38.1",
|
|
85
85
|
"just-camel-case": "^6.2.0",
|
|
86
86
|
"redstd": "^1.0.2",
|
|
87
87
|
"sql-parser-cst": "^0.42.1",
|
/package/lib/printer/visitors/call-expression/clauses/count/fixture/{count.sql → count-fix.js}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/lib/printer/visitors/call-expression/clauses/delete/fixture/{delete.sql → delete-fix.sql}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/lib/printer/visitors/call-expression/clauses/select/fixture/{select.sql → select-fix.sql}
RENAMED
|
File without changes
|
/package/lib/printer/visitors/call-expression/clauses/select/fixture/{string.sql → string-fix.sql}
RENAMED
|
File without changes
|