Skip to content

Commit ea31576

Browse files
committed
generate deparser packages
1 parent 6c6227c commit ea31576

12 files changed

+76
-193
lines changed

packages/deparser/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
__tests__/__snapshots__/kitchen-sink.test.ts.snap
2+
3+
versions/

packages/deparser/README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,23 @@ console.log(deparse(stmt));
6969
// Output: SELECT * FROM another_table
7070
```
7171

72+
### Latest Version (PostgreSQL 17)
73+
74+
```sh
75+
npm install pgsql-deparser
76+
```
77+
78+
### Version-Specific Packages (PostgreSQL 13-16)
79+
80+
While we highly recommend using PG17, for PostgreSQL versions 13-16, use the version-specific packages:
81+
82+
```sh
83+
npm install pgsql-deparser@v13 # PostgreSQL 13
84+
npm install pgsql-deparser@v14 # PostgreSQL 14
85+
npm install pgsql-deparser@v15 # PostgreSQL 15
86+
npm install pgsql-deparser@v16 # PostgreSQL 16
87+
```
88+
7289
## Options
7390

7491
The deparser accepts optional configuration for formatting and output control:

packages/transform/config/deparser-versions.json renamed to packages/deparser/config/deparser-versions.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,16 @@
3030
"author": "Dan Lynch <[email protected]>",
3131
"homepage": "https://github.com/launchql/pgsql-parser",
3232
"license": "MIT",
33+
"main": "index.js",
34+
"module": "esm/index.js",
35+
"types": "index.d.ts",
36+
"description": "PostgreSQL AST Deparser",
37+
"scripts": {
38+
"copy": "copyfiles -f ../../LICENSE README.md package.json dist",
39+
"clean": "rimraf dist",
40+
"prepare": "npm run build",
41+
"build": "npm run clean && tsc && tsc -p tsconfig.esm.json && npm run copy"
42+
},
3343
"publishConfig": {
3444
"access": "public",
3545
"directory": "dist"

packages/deparser/package.json

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,14 @@
3333
"fixtures:upstream-diff": "ts-node scripts/make-upstream-diff.ts",
3434
"lint": "eslint . --fix",
3535
"test": "jest",
36-
"test:watch": "jest --watch"
36+
"test:watch": "jest --watch",
37+
"strip-transformer-types": "ts-node scripts/strip-transformer-types.ts",
38+
"strip-direct-transformer-types": "ts-node scripts/strip-direct-transformer-types.ts",
39+
"strip-deparser-types": "ts-node scripts/strip-deparser-types.ts",
40+
"organize-transformers": "ts-node scripts/organize-transformers-by-version.ts",
41+
"generate-version-deparsers": "ts-node scripts/generate-version-deparsers.ts",
42+
"generate-packages": "ts-node scripts/generate-version-packages.ts",
43+
"prepare-versions": "npm run strip-transformer-types && npm run strip-direct-transformer-types && npm run strip-deparser-types && npm run organize-transformers && npm run generate-version-deparsers && npm run generate-packages"
3744
},
3845
"keywords": [
3946
"sql",

packages/transform/scripts/generate-version-deparsers.ts renamed to packages/deparser/scripts/generate-version-deparsers.ts

Lines changed: 1 addition & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -90,60 +90,15 @@ function updateVersionDirectory(config: VersionConfig): void {
9090
console.log(` ✓ Created index.ts with deparser functionality`);
9191
}
9292

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
12093

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-
}
13994

14095
function main(): void {
14196
console.log('Generating version-specific deparsers...\n');
14297

14398
for (const config of versionConfigs) {
14499
console.log(`Processing version ${config.version}...`);
145100
updateVersionDirectory(config);
146-
updateReadme(config.version);
101+
147102
console.log('');
148103
}
149104

packages/transform/scripts/generate-version-packages.ts renamed to packages/deparser/scripts/generate-version-packages.ts

Lines changed: 19 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -29,55 +29,38 @@ function loadConfig(): Config {
2929
}
3030

3131
function generatePackageJson(packageName: string, version: string, versionConfig: VersionConfig, template: Record<string, any>): any {
32-
return {
32+
// Start with the template and override only the version-specific fields
33+
const packageJson: any = {
34+
...template,
3335
name: packageName,
3436
version: versionConfig.deparserVersion,
35-
description: `PostgreSQL v${version} AST Deparser - Transforms v${version} ASTs to v17 and deparses them`,
36-
main: "index.js",
37-
module: "esm/index.js",
38-
types: "index.d.ts",
39-
...template,
40-
scripts: {
41-
"copy": "copyfiles -f ../../LICENSE README.md package.json dist",
42-
"clean": "rimraf dist",
43-
"prepare": "npm run build",
44-
"build": "npm run clean && tsc && tsc -p tsconfig.esm.json && npm run copy"
45-
},
4637
dependencies: {
4738
[`@pgsql/types`]: `^${versionConfig.typesVersion}`
48-
},
49-
keywords: [
50-
...template.keywords,
51-
`v${version}`,
52-
`postgresql-${version}`
53-
]
39+
}
5440
};
41+
42+
return packageJson;
5543
}
5644

5745
function generateTsConfig(): any {
5846
return {
5947
"compilerOptions": {
60-
"target": "es2018",
48+
"outDir": "dist",
49+
"rootDir": "src/",
50+
"target": "es2022",
6151
"module": "commonjs",
62-
"lib": ["es2018"],
63-
"declaration": true,
64-
"outDir": "./dist",
65-
"rootDir": "./",
66-
"strict": false,
6752
"esModuleInterop": true,
68-
"skipLibCheck": true,
6953
"forceConsistentCasingInFileNames": true,
70-
"moduleResolution": "node",
71-
"resolveJsonModule": true
54+
"strict": true,
55+
"strictNullChecks": false,
56+
"skipLibCheck": true,
57+
"sourceMap": false,
58+
"declaration": true,
59+
"resolveJsonModule": true,
60+
"moduleResolution": "node"
7261
},
73-
"include": [
74-
"**/*.ts"
75-
],
76-
"exclude": [
77-
"node_modules",
78-
"dist",
79-
"**/*.test.ts"
80-
]
62+
"include": ["src/**/*.ts"],
63+
"exclude": ["dist", "node_modules", "**/*.spec.*", "**/*.test.*"]
8164
};
8265
}
8366

@@ -125,61 +108,15 @@ function generateVersionPackages(): void {
125108
fs.writeFileSync(tsConfigEsmPath, JSON.stringify(tsConfigEsm, null, 2));
126109
console.log(` ✓ Created tsconfig.esm.json`);
127110

128-
// Update README with package name and npm tag
129-
updateReadmeWithPackageName(version, config.packageName, versionConfig.npmTag);
111+
130112

131113
console.log('');
132114
}
133115

134116
console.log('Done! Package files have been generated for all versions.');
135117
}
136118

137-
function updateReadmeWithPackageName(version: string, packageName: string, npmTag: string): void {
138-
const versionDir = path.join(VERSIONS_DIR, version);
139-
const readmePath = path.join(versionDir, 'README.md');
140-
141-
if (!fs.existsSync(readmePath)) {
142-
return;
143-
}
144-
145-
let content = fs.readFileSync(readmePath, 'utf-8');
146-
147-
// Remove any existing installation sections
148-
content = content.replace(/## Installation[\s\S]*?(?=##|$)/gm, '');
149-
150-
// Add installation instructions at the beginning
151-
const installSection = `## Installation
152-
153-
\`\`\`bash
154-
# Install specific version using npm tag
155-
npm install ${packageName}@${npmTag}
156-
157-
# Or using yarn
158-
yarn add ${packageName}@${npmTag}
159-
\`\`\`
160119

161-
`;
162-
163-
// Insert after the title
164-
const lines = content.split('\n');
165-
const titleIndex = lines.findIndex(line => line.startsWith('# '));
166-
if (titleIndex !== -1) {
167-
// Find the next non-empty line after title
168-
let insertIndex = titleIndex + 1;
169-
while (insertIndex < lines.length && lines[insertIndex].trim() === '') {
170-
insertIndex++;
171-
}
172-
lines.splice(insertIndex, 0, installSection);
173-
content = lines.join('\n');
174-
}
175-
176-
// Update import examples
177-
content = content.replace(/from '\.\/index'/g, `from '${packageName}'`);
178-
content = content.replace(/from 'pgsql-deparser-v\d+'/g, `from '${packageName}'`);
179-
180-
fs.writeFileSync(readmePath, content);
181-
console.log(` ✓ Updated README.md with package name`);
182-
}
183120

184121
// Run the script
185122
generateVersionPackages();

packages/transform/scripts/organize-transformers-by-version.ts renamed to packages/deparser/scripts/organize-transformers-by-version.ts

Lines changed: 8 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -76,49 +76,13 @@ ${transformers.map(t => ` to${t.targetVersion}: ${t.className}`).join(',\n')}
7676
`;
7777
}
7878

79-
function createReadme(version: number, transformers: TransformerMapping['transformers']): string {
80-
const transformerList = transformers.map(t =>
81-
`- \`${t.className}\` - Transform from v${version} to v${t.targetVersion}`
82-
).join('\n');
83-
84-
return `# PostgreSQL Version ${version} Transformers
85-
86-
This directory contains all transformers that start from PostgreSQL version ${version}.
87-
88-
## Available Transformers
89-
90-
${transformerList}
91-
92-
## Usage
93-
94-
### Individual Transformers
95-
96-
\`\`\`javascript
97-
import { ${transformers[0].className} } from './${path.basename(transformers[0].fileName, '.ts')}';
98-
99-
const transformer = new ${transformers[0].className}();
100-
const result = transformer.transform(node);
101-
\`\`\`
102-
103-
### All Transformers
104-
105-
\`\`\`javascript
106-
import { getTransformersForV${version} } from './index';
107-
108-
const transformers = getTransformersForV${version}();
109-
const v${transformers[0].targetVersion}Result = new transformers.to${transformers[0].targetVersion}().transform(node);
110-
\`\`\`
111-
112-
## Files
113-
114-
${transformers.map(t => `- \`${path.basename(t.fileName)}\` - ${t.className}`).join('\n')}
115-
- \`index.js\` - Exports all transformers and convenience function
116-
- \`README.md\` - This file
117-
118-
## Note
119-
120-
These are type-stripped versions optimized for bundle size. For TypeScript support, use the original source files.
121-
`;
79+
function copyReadme(versionDir: string): void {
80+
const sourcePath = path.join(__dirname, '..', 'README.md');
81+
const destPath = path.join(versionDir, 'README.md');
82+
83+
if (fs.existsSync(sourcePath)) {
84+
fs.copyFileSync(sourcePath, destPath);
85+
}
12286
}
12387

12488
function organizeByVersion(): void {
@@ -154,8 +118,7 @@ function organizeByVersion(): void {
154118
console.log(` ✓ Created index.js`);
155119

156120
// Create README
157-
const readmeContent = createReadme(mapping.sourceVersion, mapping.transformers);
158-
fs.writeFileSync(path.join(versionDir, 'README.md'), readmeContent);
121+
copyReadme(versionDir);
159122
console.log(` ✓ Created README.md`);
160123

161124
console.log('');

packages/transform/scripts/strip-deparser-types.ts renamed to packages/deparser/scripts/strip-deparser-types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import * as path from 'path';
77
* Replaces @pgsql/types imports and t.* type references with 'any'
88
*/
99

10-
const DEPARSER_SRC_DIR = '../deparser/src';
10+
const DEPARSER_SRC_DIR = 'src';
1111
const VERSIONS_DIR = 'versions';
1212
const VERSIONS = [13, 14, 15, 16];
1313

packages/transform/scripts/strip-direct-transformer-types.ts renamed to packages/deparser/scripts/strip-direct-transformer-types.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ import * as path from 'path';
88
*/
99

1010
const DIRECT_TRANSFORMER_FILES = [
11-
'src/transformers-direct/v13-to-v17/index.ts',
12-
'src/transformers-direct/v14-to-v17/index.ts',
13-
'src/transformers-direct/v15-to-v17/index.ts',
14-
'src/transformers-direct/v16-to-v17/index.ts'
11+
'../transform/src/transformers-direct/v13-to-v17/index.ts',
12+
'../transform/src/transformers-direct/v14-to-v17/index.ts',
13+
'../transform/src/transformers-direct/v15-to-v17/index.ts',
14+
'../transform/src/transformers-direct/v16-to-v17/index.ts'
1515
];
1616

1717
const OUTPUT_DIR = 'versions/direct';

packages/transform/scripts/strip-transformer-types.ts renamed to packages/deparser/scripts/strip-transformer-types.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ import * as path from 'path';
88
*/
99

1010
const TRANSFORMER_FILES = [
11-
'src/transformers/v13-to-v14.ts',
12-
'src/transformers/v14-to-v15.ts',
13-
'src/transformers/v15-to-v16.ts',
14-
'src/transformers/v16-to-v17.ts'
11+
'../transform/src/transformers/v13-to-v14.ts',
12+
'../transform/src/transformers/v14-to-v15.ts',
13+
'../transform/src/transformers/v15-to-v16.ts',
14+
'../transform/src/transformers/v16-to-v17.ts'
1515
];
1616

1717
const OUTPUT_DIR = 'versions';

0 commit comments

Comments
 (0)