happy-sql 1.5.3 → 1.7.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 (27) hide show
  1. package/ChangeLog +17 -0
  2. package/lib/parser/visitors/clause/column-definition/column-definition.js +39 -15
  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 +3 -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-default-fix.js +5 -0
  7. package/lib/parser/visitors/clause/create-table/fixture/create-table-default.sql +1 -0
  8. package/lib/parser/visitors/clause/create-table/fixture/create-table-nextval-fix.js +6 -0
  9. package/lib/parser/visitors/clause/create-table/fixture/create-table-nextval.sql +1 -0
  10. package/lib/parser/visitors/clause/create-table/fixture/create-table-not-null-fix.js +5 -0
  11. package/lib/parser/visitors/clause/create-table/fixture/create-table-not-null.sql +1 -0
  12. package/lib/parser/visitors/clause/index.js +2 -0
  13. package/lib/parser/visitors/clause/select/fixture/select-lastval.sql +1 -1
  14. package/lib/printer/visitors/binary-expression.js +5 -1
  15. package/lib/printer/visitors/call-expression/clauses/clauses.js +4 -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/lastval/fixture/lastval-fix.sql +1 -1
  20. package/lib/printer/visitors/call-expression/clauses/lastval/lastval.js +1 -1
  21. package/lib/printer/visitors/call-expression/clauses/nextval/fixture/nextval-fix.sql +1 -0
  22. package/lib/printer/visitors/call-expression/clauses/nextval/fixture/nextval.js +6 -0
  23. package/lib/printer/visitors/call-expression/clauses/nextval/nextval.js +4 -0
  24. package/lib/printer/visitors/fixture/binary-expression-fix.sql +3 -0
  25. package/lib/printer/visitors/fixture/binary-expression.js +3 -0
  26. package/package.json +2 -1
  27. package/lib/printer/visitors/call-expression/clauses/count/fixture/count-fix.js +0 -2
package/ChangeLog CHANGED
@@ -1,3 +1,20 @@
1
+ 2026.08.18, v1.7.0
2
+
3
+ feature:
4
+ - 9446e52 happy-sql: nextval
5
+ - 60be73e nextval
6
+
7
+ 2026.08.15, v1.6.0
8
+
9
+ fix:
10
+ - 92886e4 binary-expression: replace ?? with object map
11
+ - fbe9fd9 lastval: print lowercase lastval()
12
+
13
+ feature:
14
+ - 07111c0 create sequence: add
15
+ - a032611 create-sequence: add
16
+ - e3d85bf create-sequence: add
17
+
1
18
  2026.08.15, v1.5.3
2
19
 
3
20
  feature:
@@ -11,21 +11,41 @@ const getDataType = (dataType) => {
11
11
 
12
12
  const isSerial = (dataType) => getDataType(dataType).name === 'SERIAL';
13
13
 
14
+ const convertGenerated = (constraint) => {
15
+ const kws = [];
16
+
17
+ for (const kw of constraint.generatedKw)
18
+ kws.push(kw.name);
19
+
20
+ if (kws.includes('DEFAULT'))
21
+ return callExpression(identifier('identityByDefault'), []);
22
+
23
+ return callExpression(identifier('identity'), []);
24
+ };
25
+
26
+ const convertDefault = ({expr}) => {
27
+ if (expr.type !== 'func_call' || expr.name.name !== 'nextval')
28
+ return null;
29
+
30
+ const seqName = expr.args.expr.args.items[0].value;
31
+
32
+ return callExpression(identifier('nextval'), [
33
+ identifier(seqName),
34
+ ]);
35
+ };
36
+
37
+ const CONSTRAINT_VISITORS = {
38
+ constraint_primary_key: () => callExpression(identifier('primaryKey'), []),
39
+ constraint_generated: convertGenerated,
40
+ constraint_not_null: () => null,
41
+ constraint_default: convertDefault,
42
+ };
43
+
14
44
  const convertConstraint = (constraint) => {
15
- if (constraint.type === 'constraint_primary_key')
16
- return callExpression(identifier('primaryKey'), []);
45
+ const visitor = CONSTRAINT_VISITORS[constraint.type];
17
46
 
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
- }
47
+ if (visitor)
48
+ return visitor(constraint);
29
49
 
30
50
  return callExpression(identifier('autoIncrement'), []);
31
51
  };
@@ -46,8 +66,12 @@ export const convertColumnDefinition = (column) => {
46
66
  else
47
67
  args.push(identifier(getDataType(dataType).text));
48
68
 
49
- for (const constraint of constraints)
50
- args.push(convertConstraint(constraint));
69
+ for (const constraint of constraints) {
70
+ const node = convertConstraint(constraint);
71
+
72
+ if (node)
73
+ args.push(node);
74
+ }
51
75
 
52
76
  return callExpression(identifier('column'), args);
53
77
  };
@@ -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,3 @@
1
+ [
2
+ createSequence(users_id_seq),
3
+ ];
@@ -0,0 +1,2 @@
1
+ CREATE SEQUENCE users_id_seq
2
+
@@ -0,0 +1,5 @@
1
+ [
2
+ createTable(t, [
3
+ column(id, INTEGER, primaryKey()),
4
+ ]),
5
+ ];
@@ -0,0 +1 @@
1
+ CREATE TABLE t (id INTEGER DEFAULT 42 PRIMARY KEY)
@@ -0,0 +1,6 @@
1
+ [
2
+ createTable(users, [
3
+ column(id, INTEGER, nextval(users_id_seq), primaryKey()),
4
+ column(name, TEXT),
5
+ ]),
6
+ ];
@@ -0,0 +1 @@
1
+ CREATE TABLE users (id INTEGER DEFAULT nextval('users_id_seq') PRIMARY KEY, name TEXT)
@@ -0,0 +1,5 @@
1
+ [
2
+ createTable(t, [
3
+ column(id, INTEGER, primaryKey()),
4
+ ]),
5
+ ];
@@ -0,0 +1 @@
1
+ CREATE TABLE t (id INTEGER NOT NULL PRIMARY KEY)
@@ -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
@@ -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,12 +16,14 @@ 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';
22
23
  import {primaryKey} from './primary-key/primary-key.js';
23
24
  import {lastInsertRowid} from './last-insert-rowid/last-insert-rowid.js';
24
25
  import {lastval} from './lastval/lastval.js';
26
+ import {nextval} from './nextval/nextval.js';
25
27
  import {like} from './like/like.js';
26
28
  import {isNull, isNotNull} from './is-null/is-null.js';
27
29
  import {inList} from './in-list/in-list.js';
@@ -49,12 +51,14 @@ export const clauses = {
49
51
  as,
50
52
  withNamed,
51
53
  createTable,
54
+ createSequence,
52
55
  column,
53
56
  autoIncrement,
54
57
  serial,
55
58
  primaryKey,
56
59
  lastInsertRowid,
57
60
  lastval,
61
+ nextval,
58
62
  like,
59
63
  isNull,
60
64
  isNotNull,
@@ -0,0 +1,4 @@
1
+ export const createSequence = (path, {write, traverse}) => {
2
+ write('CREATE SEQUENCE ');
3
+ traverse(path.get('arguments')[0]);
4
+ };
@@ -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 @@
1
+ CREATE TABLE users (id INTEGER DEFAULT nextval('users_id_seq') PRIMARY KEY, name TEXT)
@@ -0,0 +1,6 @@
1
+ [
2
+ createTable(users, [
3
+ column(id, INTEGER, nextval(users_id_seq), primaryKey()),
4
+ column(name, TEXT),
5
+ ]),
6
+ ];
@@ -0,0 +1,4 @@
1
+ export const nextval = (path, {write}) => {
2
+ const [seq] = path.node.arguments;
3
+ write(`DEFAULT nextval('${seq.name}')`);
4
+ };
@@ -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.3",
3
+ "version": "1.7.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"
@@ -1,2 +0,0 @@
1
- SELECT COUNT(*)
2
- FROM users