happy-sql 1.5.2 → 1.6.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 (28) hide show
  1. package/ChangeLog +16 -0
  2. package/lib/parser/visitors/clause/column-definition/column-definition.js +12 -0
  3. package/lib/parser/visitors/clause/create-sequence/create-sequence.js +7 -0
  4. package/lib/parser/visitors/clause/create-sequence/fixture/create-sequence-fix.js +4 -0
  5. package/lib/parser/visitors/clause/create-sequence/fixture/create-sequence.sql +2 -0
  6. package/lib/parser/visitors/clause/create-table/fixture/create-table-identity-always-fix.js +5 -0
  7. package/lib/parser/visitors/clause/create-table/fixture/create-table-identity-always.sql +1 -0
  8. package/lib/parser/visitors/clause/create-table/fixture/create-table-identity-by-default-fix.js +5 -0
  9. package/lib/parser/visitors/clause/create-table/fixture/create-table-identity-by-default.sql +1 -0
  10. package/lib/parser/visitors/clause/from/from.js +1 -0
  11. package/lib/parser/visitors/clause/index.js +2 -0
  12. package/lib/parser/visitors/clause/select/fixture/select-lastval.sql +1 -1
  13. package/lib/parser/visitors/clause/where/where.js +1 -0
  14. package/lib/printer/visitors/binary-expression.js +5 -1
  15. package/lib/printer/visitors/call-expression/clauses/clauses.js +8 -0
  16. package/lib/printer/visitors/call-expression/clauses/create-sequence/create-sequence.js +4 -0
  17. package/lib/printer/visitors/call-expression/clauses/create-sequence/fixture/create-sequence-fix.sql +1 -0
  18. package/lib/printer/visitors/call-expression/clauses/create-sequence/fixture/create-sequence.js +3 -0
  19. package/lib/printer/visitors/call-expression/clauses/create-table/fixture/createTableIdentity-fix.sql +1 -0
  20. package/lib/printer/visitors/call-expression/clauses/create-table/fixture/createTableIdentity.js +5 -0
  21. package/lib/printer/visitors/call-expression/clauses/create-table/fixture/createTableIdentityByDefault-fix.sql +1 -0
  22. package/lib/printer/visitors/call-expression/clauses/create-table/fixture/createTableIdentityByDefault.js +5 -0
  23. package/lib/printer/visitors/call-expression/clauses/identity/identity.js +3 -0
  24. package/lib/printer/visitors/call-expression/clauses/lastval/fixture/lastval-fix.sql +1 -1
  25. package/lib/printer/visitors/call-expression/clauses/lastval/lastval.js +1 -1
  26. package/lib/printer/visitors/fixture/binary-expression-fix.sql +3 -0
  27. package/lib/printer/visitors/fixture/binary-expression.js +3 -0
  28. package/package.json +2 -1
package/ChangeLog CHANGED
@@ -1,3 +1,19 @@
1
+ 2026.08.15, v1.6.0
2
+
3
+ fix:
4
+ - 92886e4 binary-expression: replace ?? with object map
5
+ - fbe9fd9 lastval: print lowercase lastval()
6
+
7
+ feature:
8
+ - 07111c0 create sequence: add
9
+ - a032611 create-sequence: add
10
+ - e3d85bf create-sequence: add
11
+
12
+ 2026.08.15, v1.5.3
13
+
14
+ feature:
15
+ - e4a8ea9 happy-sql: identity column support
16
+
1
17
  2026.08.15, v1.5.2
2
18
 
3
19
  feature:
@@ -15,6 +15,18 @@ const convertConstraint = (constraint) => {
15
15
  if (constraint.type === 'constraint_primary_key')
16
16
  return callExpression(identifier('primaryKey'), []);
17
17
 
18
+ if (constraint.type === 'constraint_generated') {
19
+ const kws = [];
20
+
21
+ for (const kw of constraint.generatedKw)
22
+ kws.push(kw.name);
23
+
24
+ if (kws.includes('DEFAULT'))
25
+ return callExpression(identifier('identityByDefault'), []);
26
+
27
+ return callExpression(identifier('identity'), []);
28
+ }
29
+
18
30
  return callExpression(identifier('autoIncrement'), []);
19
31
  };
20
32
 
@@ -0,0 +1,7 @@
1
+ import {types} from '@putout/babel';
2
+
3
+ const {identifier, callExpression} = types;
4
+
5
+ export const convertCreateSequence = ({name}) => callExpression(identifier('createSequence'), [
6
+ identifier(name.name),
7
+ ]);
@@ -0,0 +1,4 @@
1
+ [
2
+ createSequence(users_id_seq),
3
+ ];
4
+
@@ -0,0 +1,2 @@
1
+ CREATE SEQUENCE users_id_seq
2
+
@@ -0,0 +1,5 @@
1
+ [
2
+ createTable(t, [
3
+ column(id, BIGINT, identity(), primaryKey()),
4
+ ]),
5
+ ];
@@ -0,0 +1 @@
1
+ CREATE TABLE t (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY)
@@ -0,0 +1,5 @@
1
+ [
2
+ createTable(t, [
3
+ column(id, BIGINT, identityByDefault(), primaryKey()),
4
+ ]),
5
+ ];
@@ -0,0 +1 @@
1
+ CREATE TABLE t (id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY)
@@ -78,6 +78,7 @@ const convertBinary = (node) => {
78
78
 
79
79
  if (op === 'IN') {
80
80
  const items = node.right.expr.items.map(convertOperand);
81
+
81
82
  return callExpression(identifier('inList'), [
82
83
  convertOperand(node.left),
83
84
  ...items,
@@ -4,6 +4,7 @@ import {convertUpdate} from '#parser/clause/update';
4
4
  import {convertDelete} from '#parser/clause/delete';
5
5
  import {convertWithNamed} from '#parser/clause/with-named';
6
6
  import {convertCreateTable} from '#parser/clause/create-table';
7
+ import {convertCreateSequence} from '#parser/clause/create-sequence';
7
8
  import {findClause} from '#parser/clause/find';
8
9
 
9
10
  export const convertClause = (stmt) => {
@@ -31,4 +32,5 @@ const clauseVisitors = {
31
32
  update_stmt: convertUpdate,
32
33
  delete_stmt: convertDelete,
33
34
  create_table_stmt: convertCreateTable,
35
+ create_sequence_stmt: convertCreateSequence,
34
36
  };
@@ -1 +1 @@
1
- SELECT LASTVAL() FROM users
1
+ SELECT lastval() FROM users
@@ -55,6 +55,7 @@ const convertBinary = (node) => {
55
55
 
56
56
  if (op === 'IN') {
57
57
  const items = node.right.expr.items.map(convertOperand);
58
+
58
59
  return callExpression(identifier('inList'), [
59
60
  convertOperand(node.left),
60
61
  ...items,
@@ -1,6 +1,10 @@
1
1
  const JS_TO_SQL_OP = {
2
2
  '===': '=',
3
3
  '!==': '!=',
4
+ '>=': '>=',
5
+ '<=': '<=',
6
+ '>': '>',
7
+ '<': '<',
4
8
  };
5
9
 
6
10
  export const BinaryExpression = (path, {write, traverse}) => {
@@ -8,6 +12,6 @@ export const BinaryExpression = (path, {write, traverse}) => {
8
12
 
9
13
  const op = path.node.operator;
10
14
 
11
- write(` ${JS_TO_SQL_OP[op] ?? op} `);
15
+ write(` ${JS_TO_SQL_OP[op] || op} `);
12
16
  traverse(path.get('right'));
13
17
  };
@@ -16,6 +16,7 @@ import {returning} from './returning/returning.js';
16
16
  import {as} from './as/as.js';
17
17
  import {withNamed} from './with-named/with-named.js';
18
18
  import {createTable} from './create-table/create-table.js';
19
+ import {createSequence} from './create-sequence/create-sequence.js';
19
20
  import {column} from './column/column.js';
20
21
  import {autoIncrement} from './auto-increment/auto-increment.js';
21
22
  import {serial} from './serial/serial.js';
@@ -25,6 +26,10 @@ import {lastval} from './lastval/lastval.js';
25
26
  import {like} from './like/like.js';
26
27
  import {isNull, isNotNull} from './is-null/is-null.js';
27
28
  import {inList} from './in-list/in-list.js';
29
+ import {
30
+ identity,
31
+ identityByDefault,
32
+ } from './identity/identity.js';
28
33
 
29
34
  export const clauses = {
30
35
  join,
@@ -45,6 +50,7 @@ export const clauses = {
45
50
  as,
46
51
  withNamed,
47
52
  createTable,
53
+ createSequence,
48
54
  column,
49
55
  autoIncrement,
50
56
  serial,
@@ -55,4 +61,6 @@ export const clauses = {
55
61
  isNull,
56
62
  isNotNull,
57
63
  inList,
64
+ identity,
65
+ identityByDefault,
58
66
  };
@@ -0,0 +1,4 @@
1
+ export const createSequence = (path, {write, traverse}) => {
2
+ write('CREATE SEQUENCE ');
3
+ traverse(path.get('arguments')[0]);
4
+ };
@@ -0,0 +1 @@
1
+ CREATE TABLE t (id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY)
@@ -0,0 +1,5 @@
1
+ [
2
+ createTable(t, [
3
+ column(id, BIGINT, identity(), primaryKey()),
4
+ ]),
5
+ ];
@@ -0,0 +1 @@
1
+ CREATE TABLE t (id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY)
@@ -0,0 +1,5 @@
1
+ [
2
+ createTable(t, [
3
+ column(id, BIGINT, identityByDefault(), primaryKey()),
4
+ ]),
5
+ ];
@@ -0,0 +1,3 @@
1
+ export const identity = (path, {write}) => write('GENERATED ALWAYS AS IDENTITY');
2
+
3
+ export const identityByDefault = (path, {write}) => write('GENERATED BY DEFAULT AS IDENTITY');
@@ -1,2 +1,2 @@
1
- SELECT LASTVAL()
1
+ SELECT lastval()
2
2
  FROM users
@@ -1 +1 @@
1
- export const lastval = (path, {write}) => write('LASTVAL()');
1
+ export const lastval = (path, {write}) => write('lastval()');
@@ -0,0 +1,3 @@
1
+ SELECT *
2
+ FROM t
3
+ WHERE x % 2
@@ -0,0 +1,3 @@
1
+ [
2
+ select('*', from(t), where(x % 2)),
3
+ ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "happy-sql",
3
- "version": "1.5.2",
3
+ "version": "1.6.0",
4
4
  "type": "module",
5
5
  "description": "sql to js ast parser and printer",
6
6
  "exports": {
@@ -26,6 +26,7 @@
26
26
  "#parser/clause/delete": "./lib/parser/visitors/clause/delete/delete.js",
27
27
  "#parser/clause/with-named": "./lib/parser/visitors/clause/with-named/with-named.js",
28
28
  "#parser/clause/create-table": "./lib/parser/visitors/clause/create-table/create-table.js",
29
+ "#parser/clause/create-sequence": "./lib/parser/visitors/clause/create-sequence/create-sequence.js",
29
30
  "#parser/clause/column-definition": "./lib/parser/visitors/clause/column-definition/column-definition.js",
30
31
  "#printer": "./lib/printer/printer.js",
31
32
  "#printer/test": "./test/create-printer-test.js"