-
Notifications
You must be signed in to change notification settings - Fork 59
Expand file tree
/
Copy pathgenerate.js
More file actions
134 lines (104 loc) · 3.58 KB
/
generate.js
File metadata and controls
134 lines (104 loc) · 3.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/env node
const { Client } = require('pg')
const fs = require('fs')
const path = require('path')
const query = `
SELECT json_object_agg(UPPER(PT.typname), PT.oid::int4 ORDER BY pt.oid)
FROM pg_type PT
WHERE typnamespace = (SELECT pgn.oid FROM pg_namespace pgn WHERE nspname = 'pg_catalog') -- Take only builting Postgres types with stable OID (extension types are not guaranted to be stable)
AND typtype IN ('b', 'r', 'm') -- Only basic (b), range (r), and multirange (m) types
AND typelem = 0 -- Ignore aliases
AND typisdefined -- Ignore undefined types
`
const postgresVersions = ['11', '14']
async function queryPostgresVersion (version) {
const host = `postgres-${version}`
console.log(`Querying PostgreSQL ${version} at ${host}...`)
const client = new Client({
host: host,
port: 5432,
user: process.env.PGUSER || 'postgres',
password: process.env.PGPASSWORD || 'postgres',
database: process.env.PGDATABASE || 'postgres'
})
try {
await client.connect()
const result = await client.query(query)
const types = result.rows[0].json_object_agg
console.log(`Found ${Object.keys(types).length} types in PostgreSQL ${version}`)
return types
} finally {
await client.end()
}
}
async function generate () {
console.log('Starting PostgreSQL type generation...')
// Query all available PostgreSQL versions in parallel
const typeResults = await Promise.all(
postgresVersions.map(version => queryPostgresVersion(version))
)
// Merge all types from different versions
let allTypes = {}
for (const types of typeResults) {
allTypes = { ...allTypes, ...types }
}
console.log(`Total unique types found: ${Object.keys(allTypes).length}`)
// Determine output directory
const outputDir = process.env.OUTPUT_PATH || path.join(__dirname, '..', 'lib')
// Generate main builtins file
const header = `/**
PostgreSQL builtin type OIDs
DO NOT EDIT THIS FILE BY HAND!
This file is generated automatically by the generator in generator/generate.js
To modify the types, edit the generator script and run: npm run generate
Generated by querying PostgreSQL ${postgresVersions.join(', ')} to ensure comprehensive
type coverage for parsing.
Query used:
${query.trim()}
*/`
const entries = Object.entries(allTypes)
.sort(([, a], [, b]) => a - b)
.map(([name, oid]) => ` ${name}: ${oid}`)
.join(',\n')
const content = `${header}
module.exports = {
${entries}
}
`
// Write main builtins file
const outputPath = path.join(outputDir, 'builtins.js')
await fs.promises.writeFile(outputPath, content)
// Generate TypeScript definitions
const tsHeader = `/**
PostgreSQL builtin type OIDs (TypeScript definitions)
DO NOT EDIT THIS FILE BY HAND!
This file is generated automatically by the generator in generator/generate.js
To modify the types, edit the generator script and run: npm run generate
Generated by querying PostgreSQL ${postgresVersions.join(', ')} to ensure comprehensive
type coverage for parsing.
Query used:
${query.trim()}
*/`
const tsEntries = Object.entries(allTypes)
.sort(([, a], [, b]) => a - b)
.map(([name, oid]) => ` ${name} = ${oid}`)
.join(',\n')
const tsContent = `${tsHeader}
export enum builtins {
${tsEntries}
}
`
// Write TypeScript definitions file
const tsOutputPath = path.join(outputDir, 'builtins.d.ts')
await fs.promises.writeFile(tsOutputPath, tsContent)
console.log('Generated lib/builtins.js and lib/builtins.d.ts successfully')
}
async function main () {
try {
await generate()
} catch (err) {
console.error('Error generating types:', err)
process.exit(1)
}
}
main()