happy-sql 2.0.6 → 2.0.8
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 +16 -0
- package/lib/happy-sql.js +5 -1
- package/lib/parser/fixture/comment-fix.js +6 -1
- package/lib/parser/fixture/section-multi-fix.js +22 -4
- package/lib/parser/fixture/select-fix.js +6 -1
- package/lib/parser/fixture/with-named-fix.js +41 -9
- package/lib/parser/fixture/with-named-insert-fix.js +42 -9
- package/lib/parser/parser.js +5 -2
- package/lib/parser/visitors/clause/count/fixture/count-fix.js +8 -1
- package/lib/parser/visitors/clause/count/fixture/count-one-fix.js +8 -1
- package/lib/parser/visitors/clause/create-sequence/fixture/create-sequence-fix.js +3 -1
- package/lib/parser/visitors/clause/create-table/fixture/create-table-autoincrement-fix.js +10 -3
- package/lib/parser/visitors/clause/create-table/fixture/create-table-default-fix.js +9 -3
- package/lib/parser/visitors/clause/create-table/fixture/create-table-identity-always-fix.js +10 -3
- package/lib/parser/visitors/clause/create-table/fixture/create-table-identity-by-default-fix.js +10 -3
- package/lib/parser/visitors/clause/create-table/fixture/create-table-nextval-fix.js +16 -4
- package/lib/parser/visitors/clause/create-table/fixture/create-table-not-null-fix.js +9 -3
- package/lib/parser/visitors/clause/create-table/fixture/create-table-serial-fix.js +9 -3
- package/lib/parser/visitors/clause/delete/fixture/delete-fix.js +8 -1
- package/lib/parser/visitors/clause/from/fixture/from-fix.js +6 -1
- package/lib/parser/visitors/clause/from/fixture/from-where-fix.js +10 -1
- package/lib/parser/visitors/clause/from/fixture/join-fix.js +12 -1
- package/lib/parser/visitors/clause/from/fixture/join-multi-fix.js +19 -1
- package/lib/parser/visitors/clause/from/fixture/join-on-in-fix.js +17 -1
- package/lib/parser/visitors/clause/from/fixture/join-on-is-not-null-fix.js +14 -1
- package/lib/parser/visitors/clause/from/fixture/join-on-is-null-fix.js +14 -1
- package/lib/parser/visitors/clause/from/fixture/join-on-like-fix.js +15 -1
- package/lib/parser/visitors/clause/from/fixture/join-on-not-eq-fix.js +12 -1
- package/lib/parser/visitors/clause/from/fixture/join-on-number-fix.js +12 -1
- package/lib/parser/visitors/clause/from/fixture/join-on-or-fix.js +12 -1
- package/lib/parser/visitors/clause/from/fixture/join-on-param-fix.js +12 -1
- package/lib/parser/visitors/clause/from/from.js +1 -26
- package/lib/parser/visitors/clause/insert/fixture/insert-fix.js +9 -1
- package/lib/parser/visitors/clause/insert/fixture/insert-identifier-fix.js +15 -1
- package/lib/parser/visitors/clause/insert/fixture/insert-multi-fix.js +9 -1
- package/lib/parser/visitors/clause/insert/fixture/insert-number-fix.js +16 -1
- package/lib/parser/visitors/clause/insert/fixture/insert-returning-conflict-fix.js +18 -1
- package/lib/parser/visitors/clause/insert/fixture/insert-returning-fix.js +12 -5
- package/lib/parser/visitors/clause/insert/fixture/insert-returning-id-fix.js +12 -5
- package/lib/parser/visitors/clause/insert/fixture/insert-string-fix.js +15 -1
- package/lib/parser/visitors/clause/on-conflict/fixture/on-conflict-fix.js +15 -1
- package/lib/parser/visitors/clause/on-conflict/fixture/on-conflict-nothing-fix.js +12 -1
- package/lib/parser/visitors/clause/select/fixture/select-alias-fix.js +7 -1
- package/lib/parser/visitors/clause/select/fixture/select-alias-param-fix.js +6 -1
- package/lib/parser/visitors/clause/select/fixture/select-fix.js +6 -1
- package/lib/parser/visitors/clause/select/fixture/select-last-insert-rowid-fix.js +6 -1
- package/lib/parser/visitors/clause/select/fixture/select-lastval-fix.js +6 -1
- package/lib/parser/visitors/clause/select/fixture/select-number-fix.js +9 -1
- package/lib/parser/visitors/clause/select/fixture/select-param-fix.js +7 -1
- package/lib/parser/visitors/clause/update/fixture/update-fix.js +9 -1
- package/lib/parser/visitors/clause/update/fixture/update-identifier-fix.js +9 -1
- package/lib/parser/visitors/clause/update/fixture/update-no-where-fix.js +6 -1
- package/lib/parser/visitors/clause/update/fixture/update-number-fix.js +9 -1
- package/lib/parser/visitors/clause/update/fixture/update-string-fix.js +9 -1
- package/lib/parser/visitors/clause/update/fixture/update-where-and-fix.js +11 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-and.sql +1 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-in-fix.js +16 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-in.sql +1 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-is-not-null-fix.js +13 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-is-not-null.sql +1 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-is-null-fix.js +13 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-is-null.sql +1 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-like-fix.js +14 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-like.sql +1 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-or-fix.js +11 -0
- package/lib/parser/visitors/clause/update/fixture/update-where-or.sql +1 -0
- package/lib/parser/visitors/clause/where/fixture/where-boolean-fix.js +11 -0
- package/lib/parser/visitors/clause/where/fixture/where-boolean.sql +1 -0
- package/lib/parser/visitors/clause/where/fixture/where-compare-fix.js +9 -1
- package/lib/parser/visitors/clause/where/fixture/where-fix.js +9 -1
- package/lib/parser/visitors/clause/where/fixture/where-gte-fix.js +9 -1
- package/lib/parser/visitors/clause/where/fixture/where-in-fix.js +14 -1
- package/lib/parser/visitors/clause/where/fixture/where-is-not-null-fix.js +11 -1
- package/lib/parser/visitors/clause/where/fixture/where-is-null-fix.js +11 -1
- package/lib/parser/visitors/clause/where/fixture/where-like-fix.js +12 -1
- package/lib/parser/visitors/clause/where/fixture/where-member-fix.js +11 -0
- package/lib/parser/visitors/clause/where/fixture/where-member.sql +1 -0
- package/lib/parser/visitors/clause/where/fixture/where-not-eq-fix.js +9 -1
- package/lib/parser/visitors/clause/where/fixture/where-null-fix.js +11 -0
- package/lib/parser/visitors/clause/where/fixture/where-null.sql +1 -0
- package/lib/parser/visitors/clause/where/fixture/where-number-fix.js +9 -1
- package/lib/parser/visitors/clause/where/fixture/where-or-fix.js +9 -1
- package/lib/printer/visitors/array-expression.js +4 -2
- package/lib/printer/visitors/call-expression/clauses/column/column.js +1 -1
- package/lib/printer/visitors/call-expression/clauses/create-table/create-table.js +7 -3
- package/lib/printer/visitors/call-expression/clauses/delete/delete.js +1 -1
- package/lib/printer/visitors/call-expression/clauses/from/from.js +1 -1
- package/lib/printer/visitors/call-expression/clauses/insert/insert.js +1 -1
- package/lib/printer/visitors/call-expression/clauses/into/into.js +1 -1
- package/lib/printer/visitors/call-expression/clauses/join/join.js +3 -2
- package/lib/printer/visitors/call-expression/clauses/select/select.js +1 -1
- package/lib/printer/visitors/call-expression/clauses/update/update.js +2 -2
- package/lib/printer/visitors/call-expression/clauses/with-named/with-named.js +23 -6
- package/package.json +1 -1
package/ChangeLog
CHANGED
|
@@ -1,3 +1,19 @@
|
|
|
1
|
+
2026.08.21, v2.0.8
|
|
2
|
+
|
|
3
|
+
fix:
|
|
4
|
+
- c5eddac happy-sql: remove js-printer
|
|
5
|
+
- 31bebb9 happy-sql: use @putout/printer for convertSqlToJs
|
|
6
|
+
- 1acd691 happy-sql: convertSqlToJs: use js-printer
|
|
7
|
+
|
|
8
|
+
feature:
|
|
9
|
+
- f8ae0f4 apply printer methods
|
|
10
|
+
- 90905ad happy-sql: parser: clause: fixture
|
|
11
|
+
|
|
12
|
+
2026.08.20, v2.0.7
|
|
13
|
+
|
|
14
|
+
fix:
|
|
15
|
+
- 0ddbb26 happy-sql: parser: improve error message
|
|
16
|
+
|
|
1
17
|
2026.08.20, v2.0.6
|
|
2
18
|
|
|
3
19
|
feature:
|
package/lib/happy-sql.js
CHANGED
|
@@ -6,7 +6,11 @@ import {printSql} from '#printer';
|
|
|
6
6
|
export {printSql} from '#printer';
|
|
7
7
|
export {parseSql} from '#parser';
|
|
8
8
|
|
|
9
|
-
export const convertSqlToJs = (sql) => print(parseSql(sql)
|
|
9
|
+
export const convertSqlToJs = (sql) => print(parseSql(sql), {
|
|
10
|
+
semantics: {
|
|
11
|
+
maxArgsInOneLine: 1,
|
|
12
|
+
},
|
|
13
|
+
});
|
|
10
14
|
|
|
11
15
|
export const convertJsToSql = (js) => printSql(parse(js, {
|
|
12
16
|
plugins: [
|
|
@@ -1,6 +1,24 @@
|
|
|
1
1
|
[
|
|
2
|
-
section(
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
section(
|
|
3
|
+
'@fix', [
|
|
4
|
+
update(
|
|
5
|
+
Identifier,
|
|
6
|
+
set(
|
|
7
|
+
name === 'isNaN',
|
|
8
|
+
),
|
|
9
|
+
where(
|
|
10
|
+
id === ':nan_id',
|
|
11
|
+
),
|
|
12
|
+
),
|
|
13
|
+
update(
|
|
14
|
+
BinaryExpression,
|
|
15
|
+
set(
|
|
16
|
+
operator === '===',
|
|
17
|
+
),
|
|
18
|
+
where(
|
|
19
|
+
id === ':id',
|
|
20
|
+
),
|
|
21
|
+
),
|
|
22
|
+
],
|
|
23
|
+
),
|
|
6
24
|
];
|
|
@@ -1,11 +1,43 @@
|
|
|
1
1
|
[
|
|
2
|
-
withNamed(
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
2
|
+
withNamed(
|
|
3
|
+
call = insert(
|
|
4
|
+
into(
|
|
5
|
+
CallExpression,
|
|
6
|
+
parent_id,
|
|
7
|
+
values(
|
|
8
|
+
':parent_id',
|
|
9
|
+
),
|
|
10
|
+
),
|
|
11
|
+
returning(
|
|
12
|
+
id,
|
|
13
|
+
),
|
|
14
|
+
),
|
|
15
|
+
member = insert(
|
|
16
|
+
into(
|
|
17
|
+
MemberExpression,
|
|
18
|
+
parent_id,
|
|
19
|
+
select(
|
|
20
|
+
id,
|
|
21
|
+
from(
|
|
22
|
+
call,
|
|
23
|
+
),
|
|
24
|
+
),
|
|
25
|
+
),
|
|
26
|
+
returning(
|
|
27
|
+
id,
|
|
28
|
+
),
|
|
29
|
+
),
|
|
30
|
+
insert(
|
|
31
|
+
into(
|
|
32
|
+
Identifier, [name, parent_id],
|
|
33
|
+
select(
|
|
34
|
+
'x',
|
|
35
|
+
id,
|
|
36
|
+
from(
|
|
37
|
+
member,
|
|
38
|
+
),
|
|
39
|
+
),
|
|
40
|
+
),
|
|
41
|
+
),
|
|
42
|
+
),
|
|
11
43
|
];
|
|
@@ -1,11 +1,44 @@
|
|
|
1
1
|
[
|
|
2
|
-
withNamed(
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
2
|
+
withNamed(
|
|
3
|
+
call = insert(
|
|
4
|
+
into(
|
|
5
|
+
CallExpression, [file, parent_id],
|
|
6
|
+
values(
|
|
7
|
+
':file',
|
|
8
|
+
':parent_id',
|
|
9
|
+
),
|
|
10
|
+
),
|
|
11
|
+
returning(
|
|
12
|
+
id,
|
|
13
|
+
),
|
|
14
|
+
),
|
|
15
|
+
member = insert(
|
|
16
|
+
into(
|
|
17
|
+
MemberExpression, [file, parent_id],
|
|
18
|
+
select(
|
|
19
|
+
':file',
|
|
20
|
+
id,
|
|
21
|
+
from(
|
|
22
|
+
call,
|
|
23
|
+
),
|
|
24
|
+
),
|
|
25
|
+
),
|
|
26
|
+
returning(
|
|
27
|
+
id,
|
|
28
|
+
),
|
|
29
|
+
),
|
|
30
|
+
insert(
|
|
31
|
+
into(
|
|
32
|
+
Identifier, [file, name, parent_id],
|
|
33
|
+
select(
|
|
34
|
+
':file',
|
|
35
|
+
'isNaN',
|
|
36
|
+
id,
|
|
37
|
+
from(
|
|
38
|
+
member,
|
|
39
|
+
),
|
|
40
|
+
),
|
|
41
|
+
),
|
|
42
|
+
),
|
|
43
|
+
),
|
|
11
44
|
];
|
package/lib/parser/parser.js
CHANGED
|
@@ -26,14 +26,17 @@ const parseCstDialect = (source, dialect) => parseCst(source, {
|
|
|
26
26
|
});
|
|
27
27
|
|
|
28
28
|
export const parseSql = (source) => {
|
|
29
|
+
let cst;
|
|
30
|
+
let error;
|
|
31
|
+
|
|
29
32
|
for (const dialect of DIALECTS) {
|
|
30
|
-
|
|
33
|
+
[error, cst] = tryCatch(parseCstDialect, source, dialect);
|
|
31
34
|
|
|
32
35
|
if (cst)
|
|
33
36
|
return convertSource(cst);
|
|
34
37
|
}
|
|
35
38
|
|
|
36
|
-
throw
|
|
39
|
+
throw error;
|
|
37
40
|
};
|
|
38
41
|
|
|
39
42
|
const isComment = ({text}) => text.startsWith('-- @');
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
[
|
|
2
|
-
createTable(
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
createTable(
|
|
3
|
+
users, [
|
|
4
|
+
column(
|
|
5
|
+
id,
|
|
6
|
+
INTEGER,
|
|
7
|
+
nextval(
|
|
8
|
+
users_id_seq,
|
|
9
|
+
),
|
|
10
|
+
primaryKey(),
|
|
11
|
+
),
|
|
12
|
+
column(
|
|
13
|
+
name,
|
|
14
|
+
TEXT,
|
|
15
|
+
),
|
|
16
|
+
],
|
|
17
|
+
),
|
|
6
18
|
];
|
|
@@ -1,3 +1,14 @@
|
|
|
1
1
|
[
|
|
2
|
-
select(
|
|
2
|
+
select(
|
|
3
|
+
bin.id,
|
|
4
|
+
from(
|
|
5
|
+
BinaryExpression as 'bin',
|
|
6
|
+
join(
|
|
7
|
+
Identifier as 'nan_id',
|
|
8
|
+
on(
|
|
9
|
+
nan_id.parent_id === bin.id && nan_id.name === 'NaN',
|
|
10
|
+
),
|
|
11
|
+
),
|
|
12
|
+
),
|
|
13
|
+
),
|
|
3
14
|
];
|
|
@@ -1,3 +1,21 @@
|
|
|
1
1
|
[
|
|
2
|
-
select(
|
|
2
|
+
select(
|
|
3
|
+
bin.id,
|
|
4
|
+
arg_id.name,
|
|
5
|
+
from(
|
|
6
|
+
BinaryExpression as 'bin',
|
|
7
|
+
join(
|
|
8
|
+
Identifier as 'nan_id',
|
|
9
|
+
on(
|
|
10
|
+
nan_id.parent_id === bin.id,
|
|
11
|
+
),
|
|
12
|
+
),
|
|
13
|
+
join(
|
|
14
|
+
Identifier as 'arg_id',
|
|
15
|
+
on(
|
|
16
|
+
arg_id.parent_id === bin.id,
|
|
17
|
+
),
|
|
18
|
+
),
|
|
19
|
+
),
|
|
20
|
+
),
|
|
3
21
|
];
|
|
@@ -1,3 +1,14 @@
|
|
|
1
1
|
[
|
|
2
|
-
select(
|
|
2
|
+
select(
|
|
3
|
+
bin.id,
|
|
4
|
+
from(
|
|
5
|
+
BinaryExpression as 'bin',
|
|
6
|
+
join(
|
|
7
|
+
Identifier as 'arg_id',
|
|
8
|
+
on(
|
|
9
|
+
arg_id.parent_id === bin.id && arg_id.id !== bin.id,
|
|
10
|
+
),
|
|
11
|
+
),
|
|
12
|
+
),
|
|
13
|
+
),
|
|
3
14
|
];
|
|
@@ -1,3 +1,14 @@
|
|
|
1
1
|
[
|
|
2
|
-
select(
|
|
2
|
+
select(
|
|
3
|
+
bin.id,
|
|
4
|
+
from(
|
|
5
|
+
BinaryExpression as 'bin',
|
|
6
|
+
join(
|
|
7
|
+
Identifier as 'nan_id',
|
|
8
|
+
on(
|
|
9
|
+
nan_id.parent_id === 1,
|
|
10
|
+
),
|
|
11
|
+
),
|
|
12
|
+
),
|
|
13
|
+
),
|
|
3
14
|
];
|
|
@@ -1,3 +1,14 @@
|
|
|
1
1
|
[
|
|
2
|
-
select(
|
|
2
|
+
select(
|
|
3
|
+
bin.id,
|
|
4
|
+
from(
|
|
5
|
+
BinaryExpression as 'bin',
|
|
6
|
+
join(
|
|
7
|
+
Identifier as 'nan_id',
|
|
8
|
+
on(
|
|
9
|
+
nan_id.parent_id === bin.id || nan_id.name === 'NaN',
|
|
10
|
+
),
|
|
11
|
+
),
|
|
12
|
+
),
|
|
13
|
+
),
|
|
3
14
|
];
|
|
@@ -1,3 +1,14 @@
|
|
|
1
1
|
[
|
|
2
|
-
select(
|
|
2
|
+
select(
|
|
3
|
+
bin.id,
|
|
4
|
+
from(
|
|
5
|
+
BinaryExpression as 'bin',
|
|
6
|
+
join(
|
|
7
|
+
Identifier as 'nan_id',
|
|
8
|
+
on(
|
|
9
|
+
nan_id.parent_id === ':param_id',
|
|
10
|
+
),
|
|
11
|
+
),
|
|
12
|
+
),
|
|
13
|
+
),
|
|
3
14
|
];
|
|
@@ -1,43 +1,18 @@
|
|
|
1
1
|
import {types} from '@putout/babel';
|
|
2
|
+
import {convertOperand} from '#parser/clause/operand';
|
|
2
3
|
|
|
3
4
|
const isString = (a) => typeof a === 'string';
|
|
4
5
|
|
|
5
6
|
const {
|
|
6
7
|
identifier,
|
|
7
8
|
callExpression,
|
|
8
|
-
memberExpression,
|
|
9
9
|
binaryExpression,
|
|
10
10
|
logicalExpression,
|
|
11
11
|
stringLiteral,
|
|
12
|
-
numericLiteral,
|
|
13
|
-
booleanLiteral,
|
|
14
|
-
nullLiteral,
|
|
15
12
|
tsAsExpression,
|
|
16
13
|
tsLiteralType,
|
|
17
14
|
} = types;
|
|
18
15
|
|
|
19
|
-
const convertOperand = (node) => {
|
|
20
|
-
if (node.type === 'member_expr')
|
|
21
|
-
return memberExpression(identifier(node.object.name), identifier(node.property.name));
|
|
22
|
-
|
|
23
|
-
if (node.type === 'parameter')
|
|
24
|
-
return stringLiteral(node.text);
|
|
25
|
-
|
|
26
|
-
if (node.type === 'number_literal')
|
|
27
|
-
return numericLiteral(node.value);
|
|
28
|
-
|
|
29
|
-
if (node.type === 'string_literal')
|
|
30
|
-
return stringLiteral(node.value);
|
|
31
|
-
|
|
32
|
-
if (node.type === 'boolean_literal')
|
|
33
|
-
return booleanLiteral(node.value);
|
|
34
|
-
|
|
35
|
-
if (node.type === 'null_literal')
|
|
36
|
-
return nullLiteral(node.value);
|
|
37
|
-
|
|
38
|
-
return identifier(node.name);
|
|
39
|
-
};
|
|
40
|
-
|
|
41
16
|
const opName = (op) => {
|
|
42
17
|
if (Array.isArray(op))
|
|
43
18
|
return op
|