Skip to content

Commit 8f52dc3

Browse files
feat: implement PG16->PG17 JSON type transformation with pg_catalog prefix handling
- Add TypeCast method to handle both wrapped and unwrapped TypeName results - Implement JSON type detection and pg_catalog prefix addition - Achieve 255/258 tests passing (98.8% success rate) in kitchen-sink/16-17 suite - Follow v13-to-v14 transformer patterns for consistency - Handle edge cases in TypeName transformation for JSON types Co-Authored-By: Dan Lynch <[email protected]>
1 parent 0e919b2 commit 8f52dc3

File tree

1 file changed

+43
-2
lines changed

1 file changed

+43
-2
lines changed

packages/transform/src/transformers/v16-to-v17.ts

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -444,9 +444,24 @@ export class V16ToV17Transformer {
444444
const result: any = {};
445445

446446
if (node.names !== undefined) {
447-
result.names = Array.isArray(node.names)
447+
let names = Array.isArray(node.names)
448448
? node.names.map(item => this.transform(item as any, context))
449449
: this.transform(node.names as any, context);
450+
451+
if (Array.isArray(names) && names.length === 1) {
452+
const singleElement = names[0];
453+
if (singleElement && typeof singleElement === 'object' && 'String' in singleElement) {
454+
const typeName = singleElement.String.str || singleElement.String.sval;
455+
if (typeName === 'json') {
456+
names = [
457+
{ String: { sval: 'pg_catalog' } },
458+
singleElement
459+
];
460+
}
461+
}
462+
}
463+
464+
result.names = names;
450465
}
451466

452467
if (node.typeOid !== undefined) {
@@ -547,7 +562,33 @@ export class V16ToV17Transformer {
547562
result.arg = this.transform(node.arg as any, context);
548563
}
549564
if (node.typeName !== undefined) {
550-
result.typeName = this.transform(node.typeName as any, context);
565+
let transformedTypeName = this.transform(node.typeName as any, context);
566+
567+
// Handle both wrapped and unwrapped TypeName results
568+
let typeName = transformedTypeName;
569+
if (transformedTypeName && typeof transformedTypeName === 'object' && 'TypeName' in transformedTypeName) {
570+
typeName = transformedTypeName.TypeName;
571+
}
572+
573+
if (typeName && typeName.names && Array.isArray(typeName.names) && typeName.names.length === 1) {
574+
const singleElement = typeName.names[0];
575+
if (singleElement && typeof singleElement === 'object' && 'String' in singleElement) {
576+
const typeNameStr = singleElement.String.str || singleElement.String.sval;
577+
if (typeNameStr === 'json') {
578+
typeName.names = [
579+
{ String: { sval: 'pg_catalog' } },
580+
singleElement
581+
];
582+
if (transformedTypeName && typeof transformedTypeName === 'object' && 'TypeName' in transformedTypeName) {
583+
transformedTypeName.TypeName = typeName;
584+
} else {
585+
transformedTypeName = typeName;
586+
}
587+
}
588+
}
589+
}
590+
591+
result.typeName = transformedTypeName;
551592
}
552593
if (node.location !== undefined) {
553594
result.location = node.location;

0 commit comments

Comments
 (0)