@pgsql/transform 17.9.18 → 18.0.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 (40) hide show
  1. package/18/enums.d.ts +78 -0
  2. package/18/enums.js +2 -0
  3. package/18/types.d.ts +2538 -0
  4. package/18/types.js +2 -0
  5. package/esm/18/enums.js +1 -0
  6. package/esm/18/types.js +1 -0
  7. package/esm/index.js +8 -1
  8. package/esm/multi-version-transformer.js +21 -1
  9. package/esm/transformers/v13-to-v14.js +23 -1
  10. package/esm/transformers/v16-to-v17.js +44 -1
  11. package/esm/transformers/v17-to-v18.js +204 -0
  12. package/esm/transformers-direct/index.js +6 -1
  13. package/esm/transformers-direct/v13-to-v18/index.js +84 -0
  14. package/esm/transformers-direct/v14-to-v18/index.js +73 -0
  15. package/esm/transformers-direct/v15-to-v18/index.js +62 -0
  16. package/esm/transformers-direct/v16-to-v18/index.js +51 -0
  17. package/esm/transformers-direct/v17-to-v18/index.js +39 -0
  18. package/index.d.ts +9 -1
  19. package/index.js +15 -1
  20. package/multi-version-transformer.d.ts +5 -0
  21. package/multi-version-transformer.js +21 -1
  22. package/package.json +5 -3
  23. package/transformers/v13-to-v14.d.ts +3 -0
  24. package/transformers/v13-to-v14.js +23 -1
  25. package/transformers/v16-to-v17.d.ts +3 -0
  26. package/transformers/v16-to-v17.js +44 -1
  27. package/transformers/v17-to-v18.d.ts +54 -0
  28. package/transformers/v17-to-v18.js +208 -0
  29. package/transformers-direct/index.d.ts +6 -1
  30. package/transformers-direct/index.js +12 -2
  31. package/transformers-direct/v13-to-v18/index.d.ts +28 -0
  32. package/transformers-direct/v13-to-v18/index.js +88 -0
  33. package/transformers-direct/v14-to-v18/index.d.ts +27 -0
  34. package/transformers-direct/v14-to-v18/index.js +77 -0
  35. package/transformers-direct/v15-to-v18/index.d.ts +26 -0
  36. package/transformers-direct/v15-to-v18/index.js +66 -0
  37. package/transformers-direct/v16-to-v18/index.d.ts +25 -0
  38. package/transformers-direct/v16-to-v18/index.js +55 -0
  39. package/transformers-direct/v17-to-v18/index.d.ts +24 -0
  40. package/transformers-direct/v17-to-v18/index.js +43 -0
@@ -0,0 +1,39 @@
1
+ import { V17ToV18Transformer } from '../../transformers/v17-to-v18';
2
+ /**
3
+ * Direct transformer from PG17 to PG18
4
+ * This transformer chains v17->...->v18 transformations
5
+ */
6
+ export class PG17ToPG18Transformer {
7
+ v17to18 = new V17ToV18Transformer();
8
+ transform(node) {
9
+ if (this.isParseResult(node)) {
10
+ const transformedStmts = node.stmts.map((stmtWrapper) => {
11
+ if (stmtWrapper.stmt) {
12
+ const transformedStmt = this.v17to18.transform(stmtWrapper.stmt, { parentNodeTypes: [] });
13
+ return { ...stmtWrapper, stmt: transformedStmt };
14
+ }
15
+ return stmtWrapper;
16
+ });
17
+ return {
18
+ ...node,
19
+ version: 180004, // PG18 version
20
+ stmts: transformedStmts
21
+ };
22
+ }
23
+ // Otherwise, transform as a regular node
24
+ return this.v17to18.transform(node, { parentNodeTypes: [] });
25
+ }
26
+ /**
27
+ * Transform a single statement from PG17 to PG18
28
+ * @deprecated Use transform() instead, which handles all node types
29
+ */
30
+ transformStatement(stmt) {
31
+ return this.v17to18.transform(stmt, { parentNodeTypes: [] });
32
+ }
33
+ /**
34
+ * Type guard to check if a node is a ParseResult
35
+ */
36
+ isParseResult(node) {
37
+ return node && typeof node === 'object' && 'version' in node && 'stmts' in node;
38
+ }
39
+ }
package/index.d.ts CHANGED
@@ -3,18 +3,26 @@ import { Node as PG14Node } from './14/types';
3
3
  import { Node as PG15Node } from './15/types';
4
4
  import { Node as PG16Node } from './16/types';
5
5
  import { Node as PG17Node } from './17/types';
6
+ import { Node as PG18Node } from './18/types';
6
7
  import * as PG13Types from './13/types';
7
8
  import * as PG14Types from './14/types';
8
9
  import * as PG15Types from './15/types';
9
10
  import * as PG16Types from './16/types';
10
11
  import * as PG17Types from './17/types';
12
+ import * as PG18Types from './18/types';
11
13
  export { ASTTransformer } from './multi-version-transformer';
12
14
  export { V13ToV14Transformer } from './transformers/v13-to-v14';
13
15
  export { V14ToV15Transformer } from './transformers/v14-to-v15';
14
16
  export { V15ToV16Transformer } from './transformers/v15-to-v16';
15
17
  export { V16ToV17Transformer } from './transformers/v16-to-v17';
18
+ export { V17ToV18Transformer } from './transformers/v17-to-v18';
16
19
  export { PG13ToPG17Transformer } from './transformers-direct/v13-to-v17';
17
20
  export { PG14ToPG17Transformer } from './transformers-direct/v14-to-v17';
18
21
  export { PG15ToPG17Transformer } from './transformers-direct/v15-to-v17';
19
22
  export { PG16ToPG17Transformer } from './transformers-direct/v16-to-v17';
20
- export { PG13Node, PG14Node, PG15Node, PG16Node, PG17Node, PG13Types, PG14Types, PG15Types, PG16Types, PG17Types };
23
+ export { PG13ToPG18Transformer } from './transformers-direct/v13-to-v18';
24
+ export { PG14ToPG18Transformer } from './transformers-direct/v14-to-v18';
25
+ export { PG15ToPG18Transformer } from './transformers-direct/v15-to-v18';
26
+ export { PG16ToPG18Transformer } from './transformers-direct/v16-to-v18';
27
+ export { PG17ToPG18Transformer } from './transformers-direct/v17-to-v18';
28
+ export { PG13Node, PG14Node, PG15Node, PG16Node, PG17Node, PG18Node, PG13Types, PG14Types, PG15Types, PG16Types, PG17Types, PG18Types };
package/index.js CHANGED
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.PG17Types = exports.PG16Types = exports.PG15Types = exports.PG14Types = exports.PG13Types = exports.PG16ToPG17Transformer = exports.PG15ToPG17Transformer = exports.PG14ToPG17Transformer = exports.PG13ToPG17Transformer = exports.V16ToV17Transformer = exports.V15ToV16Transformer = exports.V14ToV15Transformer = exports.V13ToV14Transformer = exports.ASTTransformer = void 0;
36
+ exports.PG18Types = exports.PG17Types = exports.PG16Types = exports.PG15Types = exports.PG14Types = exports.PG13Types = exports.PG17ToPG18Transformer = exports.PG16ToPG18Transformer = exports.PG15ToPG18Transformer = exports.PG14ToPG18Transformer = exports.PG13ToPG18Transformer = exports.PG16ToPG17Transformer = exports.PG15ToPG17Transformer = exports.PG14ToPG17Transformer = exports.PG13ToPG17Transformer = exports.V17ToV18Transformer = exports.V16ToV17Transformer = exports.V15ToV16Transformer = exports.V14ToV15Transformer = exports.V13ToV14Transformer = exports.ASTTransformer = void 0;
37
37
  const PG13Types = __importStar(require("./13/types"));
38
38
  exports.PG13Types = PG13Types;
39
39
  const PG14Types = __importStar(require("./14/types"));
@@ -44,6 +44,8 @@ const PG16Types = __importStar(require("./16/types"));
44
44
  exports.PG16Types = PG16Types;
45
45
  const PG17Types = __importStar(require("./17/types"));
46
46
  exports.PG17Types = PG17Types;
47
+ const PG18Types = __importStar(require("./18/types"));
48
+ exports.PG18Types = PG18Types;
47
49
  var multi_version_transformer_1 = require("./multi-version-transformer");
48
50
  Object.defineProperty(exports, "ASTTransformer", { enumerable: true, get: function () { return multi_version_transformer_1.ASTTransformer; } });
49
51
  var v13_to_v14_1 = require("./transformers/v13-to-v14");
@@ -54,6 +56,8 @@ var v15_to_v16_1 = require("./transformers/v15-to-v16");
54
56
  Object.defineProperty(exports, "V15ToV16Transformer", { enumerable: true, get: function () { return v15_to_v16_1.V15ToV16Transformer; } });
55
57
  var v16_to_v17_1 = require("./transformers/v16-to-v17");
56
58
  Object.defineProperty(exports, "V16ToV17Transformer", { enumerable: true, get: function () { return v16_to_v17_1.V16ToV17Transformer; } });
59
+ var v17_to_v18_1 = require("./transformers/v17-to-v18");
60
+ Object.defineProperty(exports, "V17ToV18Transformer", { enumerable: true, get: function () { return v17_to_v18_1.V17ToV18Transformer; } });
57
61
  var v13_to_v17_1 = require("./transformers-direct/v13-to-v17");
58
62
  Object.defineProperty(exports, "PG13ToPG17Transformer", { enumerable: true, get: function () { return v13_to_v17_1.PG13ToPG17Transformer; } });
59
63
  var v14_to_v17_1 = require("./transformers-direct/v14-to-v17");
@@ -62,3 +66,13 @@ var v15_to_v17_1 = require("./transformers-direct/v15-to-v17");
62
66
  Object.defineProperty(exports, "PG15ToPG17Transformer", { enumerable: true, get: function () { return v15_to_v17_1.PG15ToPG17Transformer; } });
63
67
  var v16_to_v17_2 = require("./transformers-direct/v16-to-v17");
64
68
  Object.defineProperty(exports, "PG16ToPG17Transformer", { enumerable: true, get: function () { return v16_to_v17_2.PG16ToPG17Transformer; } });
69
+ var v13_to_v18_1 = require("./transformers-direct/v13-to-v18");
70
+ Object.defineProperty(exports, "PG13ToPG18Transformer", { enumerable: true, get: function () { return v13_to_v18_1.PG13ToPG18Transformer; } });
71
+ var v14_to_v18_1 = require("./transformers-direct/v14-to-v18");
72
+ Object.defineProperty(exports, "PG14ToPG18Transformer", { enumerable: true, get: function () { return v14_to_v18_1.PG14ToPG18Transformer; } });
73
+ var v15_to_v18_1 = require("./transformers-direct/v15-to-v18");
74
+ Object.defineProperty(exports, "PG15ToPG18Transformer", { enumerable: true, get: function () { return v15_to_v18_1.PG15ToPG18Transformer; } });
75
+ var v16_to_v18_1 = require("./transformers-direct/v16-to-v18");
76
+ Object.defineProperty(exports, "PG16ToPG18Transformer", { enumerable: true, get: function () { return v16_to_v18_1.PG16ToPG18Transformer; } });
77
+ var v17_to_v18_2 = require("./transformers-direct/v17-to-v18");
78
+ Object.defineProperty(exports, "PG17ToPG18Transformer", { enumerable: true, get: function () { return v17_to_v18_2.PG17ToPG18Transformer; } });
@@ -6,4 +6,9 @@ export declare class ASTTransformer {
6
6
  transform14To17(ast: any): any;
7
7
  transform15To17(ast: any): any;
8
8
  transform16To17(ast: any): any;
9
+ transform13To18(ast: any): any;
10
+ transform14To18(ast: any): any;
11
+ transform15To18(ast: any): any;
12
+ transform16To18(ast: any): any;
13
+ transform17To18(ast: any): any;
9
14
  }
@@ -5,12 +5,14 @@ const v13_to_v14_1 = require("./transformers/v13-to-v14");
5
5
  const v14_to_v15_1 = require("./transformers/v14-to-v15");
6
6
  const v15_to_v16_1 = require("./transformers/v15-to-v16");
7
7
  const v16_to_v17_1 = require("./transformers/v16-to-v17");
8
+ const v17_to_v18_1 = require("./transformers/v17-to-v18");
8
9
  class ASTTransformer {
9
10
  transformers = {
10
11
  '13-14': new v13_to_v14_1.V13ToV14Transformer(),
11
12
  '14-15': new v14_to_v15_1.V14ToV15Transformer(),
12
13
  '15-16': new v15_to_v16_1.V15ToV16Transformer(),
13
14
  '16-17': new v16_to_v17_1.V16ToV17Transformer(),
15
+ '17-18': new v17_to_v18_1.V17ToV18Transformer(),
14
16
  };
15
17
  transform(ast, fromVersion, toVersion) {
16
18
  if (fromVersion === toVersion) {
@@ -38,6 +40,9 @@ class ASTTransformer {
38
40
  case '16-17':
39
41
  currentAst = this.transformers['16-17'].transform(currentAst, { parentNodeTypes: [] });
40
42
  break;
43
+ case '17-18':
44
+ currentAst = this.transformers['17-18'].transform(currentAst, { parentNodeTypes: [] });
45
+ break;
41
46
  default:
42
47
  throw new Error(`No transformer available for v${currentVersion} to v${nextVersion}`);
43
48
  }
@@ -46,7 +51,7 @@ class ASTTransformer {
46
51
  return currentAst;
47
52
  }
48
53
  transformToLatest(ast, fromVersion) {
49
- return this.transform(ast, fromVersion, 17);
54
+ return this.transform(ast, fromVersion, 18);
50
55
  }
51
56
  transform13To17(ast) {
52
57
  return this.transform(ast, 13, 17);
@@ -60,5 +65,20 @@ class ASTTransformer {
60
65
  transform16To17(ast) {
61
66
  return this.transform(ast, 16, 17);
62
67
  }
68
+ transform13To18(ast) {
69
+ return this.transform(ast, 13, 18);
70
+ }
71
+ transform14To18(ast) {
72
+ return this.transform(ast, 14, 18);
73
+ }
74
+ transform15To18(ast) {
75
+ return this.transform(ast, 15, 18);
76
+ }
77
+ transform16To18(ast) {
78
+ return this.transform(ast, 16, 18);
79
+ }
80
+ transform17To18(ast) {
81
+ return this.transform(ast, 17, 18);
82
+ }
63
83
  }
64
84
  exports.ASTTransformer = ASTTransformer;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pgsql/transform",
3
- "version": "17.9.18",
3
+ "version": "18.0.0",
4
4
  "author": "Constructive <developers@constructive.io>",
5
5
  "description": "Transform PostgreSQL AST types for pgsql-parser",
6
6
  "main": "index.js",
@@ -34,10 +34,12 @@
34
34
  },
35
35
  "devDependencies": {
36
36
  "@pgsql/parser": "^1.2.1",
37
+ "@pgsql/types": "^18.0.0",
38
+ "libpg-query": "18.1.1",
37
39
  "makage": "^0.1.8",
38
40
  "pg-proto-parser": "1.30.6",
39
- "pgsql-deparser": "17.18.4"
41
+ "pgsql-deparser": "18.0.0"
40
42
  },
41
43
  "keywords": [],
42
- "gitHead": "987c0c66fee20025b193cb497d1ceb8832dc4ed2"
44
+ "gitHead": "f700ee16d18aeacd2788eeb4410d73928cd11a5f"
43
45
  }
@@ -144,6 +144,9 @@ export declare class V13ToV14Transformer {
144
144
  };
145
145
  private transformTableLikeOption;
146
146
  private extractParameterNameFromFunctionName;
147
+ AlterExtensionContentsStmt(node: PG13.AlterExtensionContentsStmt, context: TransformerContext): {
148
+ AlterExtensionContentsStmt: PG14.AlterExtensionContentsStmt;
149
+ };
147
150
  ObjectWithArgs(node: PG13.ObjectWithArgs, context: TransformerContext): {
148
151
  ObjectWithArgs: PG14.ObjectWithArgs;
149
152
  };
@@ -1635,6 +1635,25 @@ class V13ToV14Transformer {
1635
1635
  // Functions like testfunc1(int), testfunc2(int), testfunc4(boolean) should NOT have parameter names
1636
1636
  return undefined;
1637
1637
  }
1638
+ AlterExtensionContentsStmt(node, context) {
1639
+ const result = {};
1640
+ const childContext = {
1641
+ ...context,
1642
+ alterExtensionObjtype: node.objtype
1643
+ };
1644
+ for (const [key, value] of Object.entries(node)) {
1645
+ if (Array.isArray(value)) {
1646
+ result[key] = value.map(item => this.transform(item, childContext));
1647
+ }
1648
+ else if (typeof value === 'object' && value !== null) {
1649
+ result[key] = this.transform(value, childContext);
1650
+ }
1651
+ else {
1652
+ result[key] = value;
1653
+ }
1654
+ }
1655
+ return { AlterExtensionContentsStmt: result };
1656
+ }
1638
1657
  ObjectWithArgs(node, context) {
1639
1658
  const result = { ...node };
1640
1659
  if (result.objname !== undefined) {
@@ -1836,6 +1855,9 @@ class V13ToV14Transformer {
1836
1855
  if (!context.parentNodeTypes || context.parentNodeTypes.length === 0) {
1837
1856
  return false;
1838
1857
  }
1858
+ if (context.alterExtensionObjtype === 'OBJECT_OPERATOR') {
1859
+ return false;
1860
+ }
1839
1861
  if (context.commentObjtype === 'OBJECT_OPERATOR' &&
1840
1862
  context.parentNodeTypes.includes('CommentStmt')) {
1841
1863
  return false;
@@ -1892,7 +1914,7 @@ class V13ToV14Transformer {
1892
1914
  }
1893
1915
  }
1894
1916
  const allowedNodeTypes = [
1895
- 'CommentStmt', 'AlterFunctionStmt', 'RenameStmt', 'AlterOwnerStmt', 'AlterObjectSchemaStmt', 'CreateCastStmt', 'CreateTransformStmt', 'AlterOpFamilyStmt', 'CreateOpClassItem', 'GrantStmt', 'RevokeStmt'
1917
+ 'CommentStmt', 'AlterFunctionStmt', 'RenameStmt', 'AlterOwnerStmt', 'AlterObjectSchemaStmt', 'CreateCastStmt', 'CreateTransformStmt', 'AlterOpFamilyStmt', 'CreateOpClassItem', 'GrantStmt', 'RevokeStmt', 'AlterExtensionContentsStmt'
1896
1918
  ];
1897
1919
  for (const node of path) {
1898
1920
  if (node && typeof node === 'object') {
@@ -495,6 +495,9 @@ export declare class V16ToV17Transformer {
495
495
  MergeStmt(node: PG16.MergeStmt, context: TransformerContext): {
496
496
  MergeStmt: PG17.MergeStmt;
497
497
  };
498
+ MergeWhenClause(node: PG16.MergeWhenClause, context: TransformerContext): {
499
+ MergeWhenClause: PG17.MergeWhenClause;
500
+ };
498
501
  AlterTableMoveAllStmt(node: PG16.AlterTableMoveAllStmt, context: TransformerContext): {
499
502
  AlterTableMoveAllStmt: PG17.AlterTableMoveAllStmt;
500
503
  };
@@ -1108,7 +1108,50 @@ class V16ToV17Transformer {
1108
1108
  return { AlterOpFamilyStmt: node };
1109
1109
  }
1110
1110
  MergeStmt(node, context) {
1111
- return { MergeStmt: node };
1111
+ const result = {};
1112
+ if (node.relation !== undefined) {
1113
+ result.relation = node.relation;
1114
+ }
1115
+ if (node.sourceRelation !== undefined) {
1116
+ result.sourceRelation = this.transform(node.sourceRelation, context);
1117
+ }
1118
+ if (node.joinCondition !== undefined) {
1119
+ result.joinCondition = this.transform(node.joinCondition, context);
1120
+ }
1121
+ if (node.mergeWhenClauses !== undefined) {
1122
+ result.mergeWhenClauses = Array.isArray(node.mergeWhenClauses)
1123
+ ? node.mergeWhenClauses.map(item => this.transform(item, context))
1124
+ : this.transform(node.mergeWhenClauses, context);
1125
+ }
1126
+ if (node.withClause !== undefined) {
1127
+ result.withClause = this.WithClause(node.withClause, context);
1128
+ }
1129
+ return { MergeStmt: result };
1130
+ }
1131
+ MergeWhenClause(node, context) {
1132
+ const result = {};
1133
+ // v17 replaces the boolean matched with matchKind
1134
+ result.matchKind = node.matched ? 'MERGE_WHEN_MATCHED' : 'MERGE_WHEN_NOT_MATCHED_BY_TARGET';
1135
+ if (node.commandType !== undefined) {
1136
+ result.commandType = node.commandType;
1137
+ }
1138
+ if (node.override !== undefined) {
1139
+ result.override = node.override;
1140
+ }
1141
+ if (node.condition !== undefined) {
1142
+ result.condition = this.transform(node.condition, context);
1143
+ }
1144
+ if (node.targetList !== undefined) {
1145
+ result.targetList = Array.isArray(node.targetList)
1146
+ ? node.targetList.map(item => this.transform(item, context))
1147
+ : this.transform(node.targetList, context);
1148
+ }
1149
+ if (node.values !== undefined) {
1150
+ result.values = Array.isArray(node.values)
1151
+ ? node.values.map(item => this.transform(item, context))
1152
+ : this.transform(node.values, context);
1153
+ }
1154
+ return { MergeWhenClause: result };
1112
1155
  }
1113
1156
  AlterTableMoveAllStmt(node, context) {
1114
1157
  return { AlterTableMoveAllStmt: node };
@@ -0,0 +1,54 @@
1
+ import * as PG17 from '../17/types';
2
+ import * as PG18 from '../18/types';
3
+ import { TransformerContext } from './context';
4
+ /**
5
+ * V17 to V18 AST Transformer
6
+ * Transforms PostgreSQL v17 AST nodes to v18 format
7
+ *
8
+ * Structural changes in v18:
9
+ * - InsertStmt/UpdateStmt/DeleteStmt/MergeStmt: returningList -> returningClause { exprs }
10
+ * - Constraint: new is_enforced flag (true by default for CHECK/FOREIGN/NOTNULL)
11
+ * - Constraint: CONSTR_GENERATED gains generated_kind ('s' = STORED, 'v' = VIRTUAL)
12
+ * - Column-level NOT NULL constraints gain initially_valid: true
13
+ */
14
+ export declare class V17ToV18Transformer {
15
+ transform(node: PG17.Node, context?: TransformerContext): any;
16
+ visit(node: PG17.Node, context?: TransformerContext): any;
17
+ /**
18
+ * Generic recursive walk that re-dispatches wrapped nodes with a
19
+ * dedicated transformer method and deep-copies everything else.
20
+ */
21
+ private walkValue;
22
+ getNodeType(node: PG17.Node): any;
23
+ getNodeData(node: PG17.Node): any;
24
+ ParseResult(node: PG17.ParseResult, context: TransformerContext): PG18.ParseResult;
25
+ RawStmt(node: PG17.RawStmt, context: TransformerContext): {
26
+ RawStmt: PG18.RawStmt;
27
+ };
28
+ /**
29
+ * Convert a v17 returningList into a v18 ReturningClause
30
+ */
31
+ private transformReturningList;
32
+ private transformDmlStatement;
33
+ InsertStmt(node: PG17.InsertStmt, context: TransformerContext): {
34
+ InsertStmt: PG18.InsertStmt;
35
+ };
36
+ UpdateStmt(node: PG17.UpdateStmt, context: TransformerContext): {
37
+ UpdateStmt: PG18.UpdateStmt;
38
+ };
39
+ DeleteStmt(node: PG17.DeleteStmt, context: TransformerContext): {
40
+ DeleteStmt: PG18.DeleteStmt;
41
+ };
42
+ MergeStmt(node: PG17.MergeStmt, context: TransformerContext): {
43
+ MergeStmt: PG18.MergeStmt;
44
+ };
45
+ AlterTableCmd(node: PG17.AlterTableCmd, context: TransformerContext): {
46
+ AlterTableCmd: PG18.AlterTableCmd;
47
+ };
48
+ VariableSetStmt(node: PG17.VariableSetStmt, context: TransformerContext): {
49
+ VariableSetStmt: PG18.VariableSetStmt;
50
+ };
51
+ Constraint(node: PG17.Constraint, context: TransformerContext): {
52
+ Constraint: PG18.Constraint;
53
+ };
54
+ }
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.V17ToV18Transformer = void 0;
4
+ /**
5
+ * V17 to V18 AST Transformer
6
+ * Transforms PostgreSQL v17 AST nodes to v18 format
7
+ *
8
+ * Structural changes in v18:
9
+ * - InsertStmt/UpdateStmt/DeleteStmt/MergeStmt: returningList -> returningClause { exprs }
10
+ * - Constraint: new is_enforced flag (true by default for CHECK/FOREIGN/NOTNULL)
11
+ * - Constraint: CONSTR_GENERATED gains generated_kind ('s' = STORED, 'v' = VIRTUAL)
12
+ * - Column-level NOT NULL constraints gain initially_valid: true
13
+ */
14
+ class V17ToV18Transformer {
15
+ transform(node, context = { parentNodeTypes: [] }) {
16
+ if (node == null) {
17
+ return null;
18
+ }
19
+ if (typeof node === 'number' || node instanceof Number) {
20
+ return node;
21
+ }
22
+ if (typeof node === 'string') {
23
+ return node;
24
+ }
25
+ try {
26
+ return this.visit(node, context);
27
+ }
28
+ catch (error) {
29
+ const nodeType = Object.keys(node)[0];
30
+ throw new Error(`Error transforming ${nodeType}: ${error.message}`);
31
+ }
32
+ }
33
+ visit(node, context = { parentNodeTypes: [] }) {
34
+ if (node && typeof node === 'object' && 'version' in node && 'stmts' in node) {
35
+ return this.ParseResult(node, context);
36
+ }
37
+ const nodeType = this.getNodeType(node);
38
+ // Handle empty objects
39
+ if (!nodeType) {
40
+ return {};
41
+ }
42
+ const nodeData = this.getNodeData(node);
43
+ const methodName = nodeType;
44
+ if (typeof this[methodName] === 'function') {
45
+ const childContext = {
46
+ ...context,
47
+ parentNodeTypes: [...context.parentNodeTypes, nodeType]
48
+ };
49
+ const result = this[methodName](nodeData, childContext);
50
+ return result;
51
+ }
52
+ // No specific method: recurse into children so nested statements
53
+ // (e.g. DML inside CTEs) still get transformed
54
+ return this.walkValue(node, context);
55
+ }
56
+ /**
57
+ * Generic recursive walk that re-dispatches wrapped nodes with a
58
+ * dedicated transformer method and deep-copies everything else.
59
+ */
60
+ walkValue(value, context) {
61
+ if (value == null || typeof value !== 'object') {
62
+ return value;
63
+ }
64
+ if (Array.isArray(value)) {
65
+ return value.map(item => this.walkValue(item, context));
66
+ }
67
+ const keys = Object.keys(value);
68
+ if (keys.length === 1 && typeof this[keys[0]] === 'function') {
69
+ // Wrapped node with a dedicated transformer method
70
+ return this.visit(value, context);
71
+ }
72
+ const result = {};
73
+ for (const key of keys) {
74
+ result[key] = this.walkValue(value[key], context);
75
+ }
76
+ return result;
77
+ }
78
+ getNodeType(node) {
79
+ return Object.keys(node)[0];
80
+ }
81
+ getNodeData(node) {
82
+ const keys = Object.keys(node);
83
+ if (keys.length === 1 && typeof node[keys[0]] === 'object') {
84
+ return node[keys[0]];
85
+ }
86
+ return node;
87
+ }
88
+ ParseResult(node, context) {
89
+ if (node && typeof node === 'object' && 'version' in node && 'stmts' in node) {
90
+ return {
91
+ version: 180004, // PG18 version
92
+ stmts: node.stmts.map((stmt) => {
93
+ if (stmt && typeof stmt === 'object' && 'stmt' in stmt) {
94
+ return {
95
+ ...stmt,
96
+ stmt: this.transform(stmt.stmt, context)
97
+ };
98
+ }
99
+ return this.transform(stmt, context);
100
+ })
101
+ };
102
+ }
103
+ return node;
104
+ }
105
+ RawStmt(node, context) {
106
+ const result = {};
107
+ if (node.stmt !== undefined) {
108
+ result.stmt = this.transform(node.stmt, context);
109
+ }
110
+ if (node.stmt_location !== undefined) {
111
+ result.stmt_location = node.stmt_location;
112
+ }
113
+ if (node.stmt_len !== undefined) {
114
+ result.stmt_len = node.stmt_len;
115
+ }
116
+ return { RawStmt: result };
117
+ }
118
+ /**
119
+ * Convert a v17 returningList into a v18 ReturningClause
120
+ */
121
+ transformReturningList(returningList, context) {
122
+ return {
123
+ exprs: returningList.map(item => this.transform(item, context))
124
+ };
125
+ }
126
+ transformDmlStatement(nodeType, node, context) {
127
+ const result = {};
128
+ for (const key of Object.keys(node)) {
129
+ if (key === 'returningList') {
130
+ result.returningClause = this.transformReturningList(node.returningList, context);
131
+ }
132
+ else {
133
+ result[key] = this.walkValue(node[key], context);
134
+ }
135
+ }
136
+ return { [nodeType]: result };
137
+ }
138
+ InsertStmt(node, context) {
139
+ return this.transformDmlStatement('InsertStmt', node, context);
140
+ }
141
+ UpdateStmt(node, context) {
142
+ return this.transformDmlStatement('UpdateStmt', node, context);
143
+ }
144
+ DeleteStmt(node, context) {
145
+ return this.transformDmlStatement('DeleteStmt', node, context);
146
+ }
147
+ MergeStmt(node, context) {
148
+ return this.transformDmlStatement('MergeStmt', node, context);
149
+ }
150
+ AlterTableCmd(node, context) {
151
+ const result = {};
152
+ for (const key of Object.keys(node)) {
153
+ result[key] = this.walkValue(node[key], context);
154
+ }
155
+ // v18 wraps ALTER CONSTRAINT definitions in the new ATAlterConstraint node
156
+ if (node.subtype === 'AT_AlterConstraint' && node.def?.Constraint) {
157
+ const constraint = node.def.Constraint;
158
+ const alterConstraint = {};
159
+ if (constraint.conname !== undefined) {
160
+ alterConstraint.conname = constraint.conname;
161
+ }
162
+ alterConstraint.is_enforced = true;
163
+ // v17 ALTER CONSTRAINT could only change deferrability
164
+ alterConstraint.alterDeferrability = true;
165
+ if (constraint.deferrable !== undefined) {
166
+ alterConstraint.deferrable = constraint.deferrable;
167
+ }
168
+ if (constraint.initdeferred !== undefined) {
169
+ alterConstraint.initdeferred = constraint.initdeferred;
170
+ }
171
+ result.def = { ATAlterConstraint: alterConstraint };
172
+ }
173
+ return { AlterTableCmd: result };
174
+ }
175
+ VariableSetStmt(node, context) {
176
+ const result = {};
177
+ for (const key of Object.keys(node)) {
178
+ result[key] = this.walkValue(node[key], context);
179
+ }
180
+ // v18 marks SET TRANSACTION / SESSION CHARACTERISTICS args as jumbled
181
+ if (node.kind === 'VAR_SET_MULTI' && (node.name === 'TRANSACTION' || node.name === 'SESSION CHARACTERISTICS')) {
182
+ result.jumble_args = true;
183
+ }
184
+ return { VariableSetStmt: result };
185
+ }
186
+ Constraint(node, context) {
187
+ const result = {};
188
+ for (const key of Object.keys(node)) {
189
+ result[key] = this.walkValue(node[key], context);
190
+ }
191
+ // v18 constraints are enforced by default; v17 grammar had no ENFORCED syntax
192
+ if (node.contype === 'CONSTR_CHECK' || node.contype === 'CONSTR_FOREIGN') {
193
+ result.is_enforced = true;
194
+ }
195
+ if (node.contype === 'CONSTR_NOTNULL') {
196
+ // v17 only produces column-level NOT NULL constraints, which in v18
197
+ // carry is_enforced and initially_valid
198
+ result.is_enforced = true;
199
+ result.initially_valid = true;
200
+ }
201
+ if (node.contype === 'CONSTR_GENERATED' && result.generated_kind === undefined) {
202
+ // v17 only supports STORED generated columns
203
+ result.generated_kind = 's';
204
+ }
205
+ return { Constraint: result };
206
+ }
207
+ }
208
+ exports.V17ToV18Transformer = V17ToV18Transformer;
@@ -1,8 +1,13 @@
1
1
  /**
2
- * Direct transformers for PostgreSQL version upgrades to PG17
2
+ * Direct transformers for PostgreSQL version upgrades to PG17/PG18
3
3
  * These transformers are designed for tree-shaking optimization
4
4
  */
5
5
  export { PG13ToPG17Transformer } from './v13-to-v17';
6
6
  export { PG14ToPG17Transformer } from './v14-to-v17';
7
7
  export { PG15ToPG17Transformer } from './v15-to-v17';
8
8
  export { PG16ToPG17Transformer } from './v16-to-v17';
9
+ export { PG13ToPG18Transformer } from './v13-to-v18';
10
+ export { PG14ToPG18Transformer } from './v14-to-v18';
11
+ export { PG15ToPG18Transformer } from './v15-to-v18';
12
+ export { PG16ToPG18Transformer } from './v16-to-v18';
13
+ export { PG17ToPG18Transformer } from './v17-to-v18';
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  /**
3
- * Direct transformers for PostgreSQL version upgrades to PG17
3
+ * Direct transformers for PostgreSQL version upgrades to PG17/PG18
4
4
  * These transformers are designed for tree-shaking optimization
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.PG16ToPG17Transformer = exports.PG15ToPG17Transformer = exports.PG14ToPG17Transformer = exports.PG13ToPG17Transformer = void 0;
7
+ exports.PG17ToPG18Transformer = exports.PG16ToPG18Transformer = exports.PG15ToPG18Transformer = exports.PG14ToPG18Transformer = exports.PG13ToPG18Transformer = exports.PG16ToPG17Transformer = exports.PG15ToPG17Transformer = exports.PG14ToPG17Transformer = exports.PG13ToPG17Transformer = void 0;
8
8
  var v13_to_v17_1 = require("./v13-to-v17");
9
9
  Object.defineProperty(exports, "PG13ToPG17Transformer", { enumerable: true, get: function () { return v13_to_v17_1.PG13ToPG17Transformer; } });
10
10
  var v14_to_v17_1 = require("./v14-to-v17");
@@ -13,3 +13,13 @@ var v15_to_v17_1 = require("./v15-to-v17");
13
13
  Object.defineProperty(exports, "PG15ToPG17Transformer", { enumerable: true, get: function () { return v15_to_v17_1.PG15ToPG17Transformer; } });
14
14
  var v16_to_v17_1 = require("./v16-to-v17");
15
15
  Object.defineProperty(exports, "PG16ToPG17Transformer", { enumerable: true, get: function () { return v16_to_v17_1.PG16ToPG17Transformer; } });
16
+ var v13_to_v18_1 = require("./v13-to-v18");
17
+ Object.defineProperty(exports, "PG13ToPG18Transformer", { enumerable: true, get: function () { return v13_to_v18_1.PG13ToPG18Transformer; } });
18
+ var v14_to_v18_1 = require("./v14-to-v18");
19
+ Object.defineProperty(exports, "PG14ToPG18Transformer", { enumerable: true, get: function () { return v14_to_v18_1.PG14ToPG18Transformer; } });
20
+ var v15_to_v18_1 = require("./v15-to-v18");
21
+ Object.defineProperty(exports, "PG15ToPG18Transformer", { enumerable: true, get: function () { return v15_to_v18_1.PG15ToPG18Transformer; } });
22
+ var v16_to_v18_1 = require("./v16-to-v18");
23
+ Object.defineProperty(exports, "PG16ToPG18Transformer", { enumerable: true, get: function () { return v16_to_v18_1.PG16ToPG18Transformer; } });
24
+ var v17_to_v18_1 = require("./v17-to-v18");
25
+ Object.defineProperty(exports, "PG17ToPG18Transformer", { enumerable: true, get: function () { return v17_to_v18_1.PG17ToPG18Transformer; } });
@@ -0,0 +1,28 @@
1
+ import * as PG13 from '../../13/types';
2
+ import * as PG18 from '../../18/types';
3
+ /**
4
+ * Direct transformer from PG13 to PG18
5
+ * This transformer chains v13->...->v18 transformations
6
+ */
7
+ export declare class PG13ToPG18Transformer {
8
+ private v13to14;
9
+ private v14to15;
10
+ private v15to16;
11
+ private v16to17;
12
+ private v17to18;
13
+ /**
14
+ * Transform a node or parse result from PG13 to PG18
15
+ * @param node - Can be a ParseResult or any Node type
16
+ */
17
+ transform(node: PG13.Node): PG18.Node;
18
+ transform(node: PG13.ParseResult): PG18.ParseResult;
19
+ /**
20
+ * Transform a single statement from PG13 to PG18
21
+ * @deprecated Use transform() instead, which handles all node types
22
+ */
23
+ transformStatement(stmt: any): any;
24
+ /**
25
+ * Type guard to check if a node is a ParseResult
26
+ */
27
+ private isParseResult;
28
+ }