Skip to content

Commit 580de19

Browse files
committed
deparsers
1 parent 3521571 commit 580de19

File tree

4 files changed

+391
-1
lines changed

4 files changed

+391
-1
lines changed

packages/transform/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
"strip-types": "ts-node scripts/strip-transformer-types.ts",
3030
"strip-direct-types": "ts-node scripts/strip-direct-transformer-types.ts",
3131
"strip-all-types": "npm run strip-types && npm run strip-direct-types",
32+
"generate-deparsers": "ts-node scripts/generate-version-deparsers.ts",
33+
"organize-versions": "ts-node scripts/organize-transformers-by-version.ts",
34+
"prepare-versions": "npm run strip-all-types && npm run organize-versions",
3235
"lint": "eslint . --fix",
3336
"test": "jest",
3437
"test:watch": "jest --watch",
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
import * as fs from 'fs';
2+
import * as path from 'path';
3+
4+
/**
5+
* Script to generate deparser index files for each version
6+
* Creates index.ts files that use transformers to provide deparse functionality
7+
*/
8+
9+
interface VersionConfig {
10+
version: number;
11+
directTransformerClass: string;
12+
directTransformerFile: string;
13+
}
14+
15+
const VERSIONS_DIR = 'versions';
16+
17+
const versionConfigs: VersionConfig[] = [
18+
{
19+
version: 13,
20+
directTransformerClass: 'PG13ToPG17Transformer',
21+
directTransformerFile: './v13-to-v17'
22+
},
23+
{
24+
version: 14,
25+
directTransformerClass: 'PG14ToPG17Transformer',
26+
directTransformerFile: './v14-to-v17'
27+
},
28+
{
29+
version: 15,
30+
directTransformerClass: 'PG15ToPG17Transformer',
31+
directTransformerFile: './v15-to-v17'
32+
},
33+
{
34+
version: 16,
35+
directTransformerClass: 'PG16ToPG17Transformer',
36+
directTransformerFile: './v16-to-v17'
37+
}
38+
];
39+
40+
function generateDeparserIndex(config: VersionConfig): string {
41+
return `/**
42+
* Deparser for PostgreSQL version ${config.version}
43+
* Auto-generated by generate-version-deparsers.ts
44+
*/
45+
46+
import {
47+
deparse as deparse17,
48+
deparseSync as deparseSync17,
49+
DeparserOptions
50+
} from 'pgsql-deparser';
51+
import { Node, ParseResult } from '@pgsql/types';
52+
import { ${config.directTransformerClass} } from '${config.directTransformerFile}';
53+
54+
const tx = new ${config.directTransformerClass}();
55+
56+
export async function deparse(query: Node | Node[] | ParseResult, opts?: DeparserOptions): Promise<string> {
57+
const ast17 = tx.transform(query);
58+
return await deparse17(ast17, opts);
59+
}
60+
61+
export function deparseSync(query: Node | Node[] | ParseResult, opts?: DeparserOptions): string {
62+
const ast17 = tx.transform(query);
63+
return deparseSync17(ast17, opts);
64+
}
65+
66+
// Re-export DeparserOptions for convenience
67+
export { DeparserOptions } from 'pgsql-deparser';
68+
`;
69+
}
70+
71+
function updateVersionDirectory(config: VersionConfig): void {
72+
const versionDir = path.join(VERSIONS_DIR, config.version.toString());
73+
74+
if (!fs.existsSync(versionDir)) {
75+
console.error(`Version directory ${versionDir} does not exist!`);
76+
return;
77+
}
78+
79+
// Remove old index.js if it exists
80+
const oldIndexPath = path.join(versionDir, 'index.js');
81+
if (fs.existsSync(oldIndexPath)) {
82+
fs.unlinkSync(oldIndexPath);
83+
console.log(` ✓ Removed old index.js`);
84+
}
85+
86+
// Generate new index.ts
87+
const indexContent = generateDeparserIndex(config);
88+
const indexPath = path.join(versionDir, 'index.ts');
89+
fs.writeFileSync(indexPath, indexContent);
90+
console.log(` ✓ Created index.ts with deparser functionality`);
91+
}
92+
93+
function updateReadme(version: number): void {
94+
const versionDir = path.join(VERSIONS_DIR, version.toString());
95+
const readmePath = path.join(versionDir, 'README.md');
96+
97+
const readmeContent = `# PostgreSQL Version ${version} Deparser
98+
99+
This directory contains a deparser for PostgreSQL version ${version} that automatically transforms ASTs to v17 format before deparsing.
100+
101+
## Usage
102+
103+
\`\`\`javascript
104+
import { deparse, deparseSync } from './index';
105+
106+
// Async deparse
107+
const sql = await deparse(pgNode);
108+
109+
// Sync deparse
110+
const sql = deparseSync(pgNode);
111+
112+
// With options
113+
const sql = await deparse(pgNode, {
114+
paramPrefix: '$',
115+
trimSpace: true
116+
});
117+
\`\`\`
118+
119+
## How it Works
120+
121+
1. The deparser uses the \`PG${version}ToPG17Transformer\` to transform your v${version} AST to v17 format
122+
2. It then uses the standard \`pgsql-deparser\` to generate SQL from the v17 AST
123+
3. This ensures compatibility with the latest deparser while supporting older AST versions
124+
125+
## Files
126+
127+
- \`index.ts\` - Main deparser exports
128+
- \`v${version}-to-v17.ts\` - Direct transformer to v17
129+
- Other transformer files are dependencies for the direct transformer
130+
131+
## Note
132+
133+
These are type-stripped versions optimized for bundle size. For TypeScript support with full types, use the original source files from the main package.
134+
`;
135+
136+
fs.writeFileSync(readmePath, readmeContent);
137+
console.log(` ✓ Updated README.md`);
138+
}
139+
140+
function main(): void {
141+
console.log('Generating version-specific deparsers...\n');
142+
143+
for (const config of versionConfigs) {
144+
console.log(`Processing version ${config.version}...`);
145+
updateVersionDirectory(config);
146+
updateReadme(config.version);
147+
console.log('');
148+
}
149+
150+
console.log('Done! Version-specific deparsers have been generated.');
151+
}
152+
153+
// Run the script
154+
main();

0 commit comments

Comments
 (0)