Skip to content

Commit

Permalink
Merge ecaab17 into 8d21fa0
Browse files Browse the repository at this point in the history
  • Loading branch information
mmkal committed Jan 26, 2020
2 parents 8d21fa0 + ecaab17 commit eaafffe
Show file tree
Hide file tree
Showing 8 changed files with 479 additions and 54 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ node_modules
dist
coverage
*.tgz
*.log
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,10 @@
"coveralls": "^3.0.5",
"jest": "^24.9.0",
"lerna": "^3.16.1",
"nodemon": "^2.0.2",
"npm-run-all": "^4.1.5",
"prettier": "^1.18.2",
"slonik": "^21.4.1",
"slonik": "^21.4.2",
"ts-expect": "^1.1.0",
"ts-jest": "^24.1.0",
"ts-node": "^8.3.0",
Expand Down
3 changes: 2 additions & 1 deletion packages/demo/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@
"homepage": "https://github.com/mmkal/slonik-tools/tree/master/packages/demo#readme",
"dependencies": {
"dotenv-extended": "^2.4.0",
"express": "^4.17.1"
"express": "^4.17.1",
"slonik-interceptor-field-name-transformation": "^1.5.2"
},
"devDependencies": {
"@slonik/migrator": "^0.2.0",
Expand Down
12 changes: 11 additions & 1 deletion packages/demo/src/db.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import {setupTypeGen} from '@slonik/typegen'
import {knownTypes} from './generated/db'
import {createPool} from 'slonik'
// @ts-ignore
import {createFieldNameTransformationInterceptor} from 'slonik-interceptor-field-name-transformation'
import {load} from 'dotenv-extended'
import {camelCase, compact} from 'lodash'

load()

Expand All @@ -11,6 +14,13 @@ export const {sql, poolConfig} = setupTypeGen({
typeMapper: {
timestamptz: ['Date', str => new Date(str)],
},
transformProperty: p => ({...p, name: camelCase(p.name)}),
})

export const slonik = createPool(process.env.POSTGRES_CONNECTION_STRING!, poolConfig)
export const slonik = createPool(process.env.POSTGRES_CONNECTION_STRING!, {
...poolConfig,
interceptors: [
createFieldNameTransformationInterceptor({format: 'CAMEL_CASE'}), // requires `transformProperty`
...compact(poolConfig.interceptors)
],
})
4 changes: 2 additions & 2 deletions packages/demo/src/generated/db/Message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export interface Message_QueryTypeMap {
/** pg_type.typname: varchar */
content: string
/** pg_type.typname: timestamptz */
created_at: Date
createdAt: Date
}
}

Expand All @@ -20,4 +20,4 @@ export type Message = {
}
export const Message = {} as Message

export const Message_meta_v0 = [{"properties":[{"name":"id","value":"number","description":"pg_type.typname: int4"},{"name":"content","value":"string","description":"pg_type.typname: varchar"},{"name":"created_at","value":"Date","description":"pg_type.typname: timestamptz"}],"description":"select * from messages\n where id < $1\n order by created_at desc\n limit 10"}]
export const Message_meta_v0 = [{"properties":[{"name":"id","value":"number","description":"pg_type.typname: int4"},{"name":"content","value":"string","description":"pg_type.typname: varchar"},{"name":"createdAt","value":"Date","description":"pg_type.typname: timestamptz"}],"description":"select * from messages\n where id < $1\n order by created_at desc\n limit 10"}]
2 changes: 1 addition & 1 deletion packages/demo/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export const getApp = () => {
messages.map(m => ({
id: m.id,
text: m.content,
secondsAgo: Math.floor((Date.now() - m.created_at.getTime()) / 1000),
secondsAgo: Math.floor((Date.now() - m.createdAt.getTime()) / 1000),
})),
)
})
Expand Down
20 changes: 15 additions & 5 deletions packages/typegen/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,14 @@ export interface TypeGenConfig<KnownTypes> {
typeMapper?: {
[K in keyof PgTypes<KnownTypes>]?: [string, (value: string) => unknown]
}
/**
* @experimental
*
* transform the input data for each property passed to the code-generator.
* For example, can be used to camel-case keys if you're using an interceptor
* like `slonik-interceptor-field-name-transformation`
*/
transformProperty?: (input: Property) => Property
}

export type PgTypes<KnownTypes> = {
Expand Down Expand Up @@ -189,11 +197,13 @@ export const setupSqlGetter = <KnownTypes>(config: TypeGenConfig<KnownTypes>): T
_identifiers.forEach(identifier =>
writeTypes(
identifier,
result.fields.map(f => ({
name: f.name,
value: typescriptTypeName(f.dataTypeId),
description: _oidToTypeName && `pg_type.typname: ${_oidToTypeName[f.dataTypeId]}`,
})),
result.fields
.map(f => ({
name: f.name,
value: typescriptTypeName(f.dataTypeId),
description: _oidToTypeName && `pg_type.typname: ${_oidToTypeName[f.dataTypeId]}`,
}))
.map(config.transformProperty || (p => p)),
trimmedSql.trim(),
),
)
Expand Down
Loading

0 comments on commit eaafffe

Please sign in to comment.