Skip to content

Commit

Permalink
Add enum type to fix #161
Browse files Browse the repository at this point in the history
  • Loading branch information
martijndeh committed Nov 8, 2020
1 parent 3bbf773 commit 86674ee
Show file tree
Hide file tree
Showing 6 changed files with 59 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/__checks__/__snapshots__/data-types.check.ts.snap
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`data-types should select all data types (type) should match snapshot 1`] = `"{ int8: GetDataType<string, false>; bigint: GetDataType<string, false>; bigserial: GetDataType<string, false>; serial8: GetDataType<string, false>; bit: GetDataType<string, false>; bitVarying: GetDataType<string, false>; varbit: GetDataType<string, false>; boolean: GetDataType<boolean, false>; bool: GetDataType<boolean, false>; box: GetDataType<string, false>; bytea: GetDataType<Buffer, false>; character: GetDataType<string, false>; char: GetDataType<string, false>; characterVarying: GetDataType<string, false>; varchar: GetDataType<string, false>; circle: GetDataType<{ x: number; y: number; radius: number; }, false>; cidr: GetDataType<string, false>; caseInsensitiveText: GetDataType<string, false>; citext: GetDataType<string, false>; date: GetDataType<Date, false>; doublePrecision: GetDataType<number, false>; float8: GetDataType<number, false>; inet: GetDataType<string, false>; decimal: GetDataType<string, false>; integer: GetDataType<number, false>; int: GetDataType<number, false>; int4: GetDataType<number, false>; interval: GetDataType<unknown, false>; json: GetDataType<unknown, false>; jsonb: GetDataType<unknown, false>; line: GetDataType<string, false>; lseg: GetDataType<string, false>; macaddr: GetDataType<string, false>; macaddr8: GetDataType<string, false>; money: GetDataType<string, false>; numeric: GetDataType<string, false>; point: GetDataType<{ x: number; y: number; }, false>; path: GetDataType<string, false>; pgLsn: GetDataType<string, false>; polygon: GetDataType<string, false>; real: GetDataType<number, false>; float4: GetDataType<number, false>; smallint: GetDataType<number, false>; int2: GetDataType<number, false>; serial: GetDataType<number, false>; serial4: GetDataType<number, false>; smallserial: GetDataType<number, false>; serial2: GetDataType<number, false>; text: GetDataType<string, false>; time: GetDataType<string, false>; timeWithoutTimeZone: GetDataType<string, false>; timeWithTimeZone: GetDataType<string, false>; timestamp: GetDataType<Date, false>; timestamptz: GetDataType<Date, false>; timestampWithoutTimeZone: GetDataType<Date, false>; timestampWithTimeZone: GetDataType<Date, false>; tsquery: GetDataType<string, false>; tsvector: GetDataType<string, false>; txidSnapshot: GetDataType<string, false>; uuid: GetDataType<string, false>; xml: GetDataType<string, false>; }"`;
exports[`data-types should select all data types (type) should match snapshot 1`] = `"{ int8: GetDataType<string, false>; bigint: GetDataType<string, false>; bigserial: GetDataType<string, false>; serial8: GetDataType<string, false>; bit: GetDataType<string, false>; bitVarying: GetDataType<string, false>; varbit: GetDataType<string, false>; boolean: GetDataType<boolean, false>; bool: GetDataType<boolean, false>; box: GetDataType<string, false>; bytea: GetDataType<Buffer, false>; character: GetDataType<string, false>; char: GetDataType<string, false>; characterVarying: GetDataType<string, false>; varchar: GetDataType<string, false>; circle: GetDataType<{ x: number; y: number; radius: number; }, false>; cidr: GetDataType<string, false>; caseInsensitiveText: GetDataType<string, false>; citext: GetDataType<string, false>; date: GetDataType<Date, false>; doublePrecision: GetDataType<number, false>; float8: GetDataType<number, false>; inet: GetDataType<string, false>; decimal: GetDataType<string, false>; integer: GetDataType<number, false>; int: GetDataType<number, false>; int4: GetDataType<number, false>; interval: GetDataType<unknown, false>; json: GetDataType<unknown, false>; jsonb: GetDataType<unknown, false>; line: GetDataType<string, false>; lseg: GetDataType<string, false>; macaddr: GetDataType<string, false>; macaddr8: GetDataType<string, false>; money: GetDataType<string, false>; numeric: GetDataType<string, false>; point: GetDataType<{ x: number; y: number; }, false>; path: GetDataType<string, false>; pgLsn: GetDataType<string, false>; polygon: GetDataType<string, false>; real: GetDataType<number, false>; float4: GetDataType<number, false>; smallint: GetDataType<number, false>; int2: GetDataType<number, false>; serial: GetDataType<number, false>; serial4: GetDataType<number, false>; smallserial: GetDataType<number, false>; serial2: GetDataType<number, false>; text: GetDataType<string, false>; time: GetDataType<string, false>; timeWithoutTimeZone: GetDataType<string, false>; timeWithTimeZone: GetDataType<string, false>; timestamp: GetDataType<Date, false>; timestamptz: GetDataType<Date, false>; timestampWithoutTimeZone: GetDataType<Date, false>; timestampWithTimeZone: GetDataType<Date, false>; tsquery: GetDataType<string, false>; tsvector: GetDataType<string, false>; txidSnapshot: GetDataType<string, false>; uuid: GetDataType<string, false>; xml: GetDataType<string, false>; enumType: GetDataType<\\"A\\" | \\"B\\" | \\"C\\", false>; }"`;
3 changes: 3 additions & 0 deletions src/__checks__/data-types.check.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import {
defineDb,
defineTable,
doublePrecision,
enumType,
float4,
float8,
inet,
Expand Down Expand Up @@ -140,6 +141,7 @@ const foo = defineTable({
txidSnapshot: txidSnapshot(),
uuid: uuid(),
xml: xml(),
enumType: enumType('my_enum-type', ['A', 'B', 'C'] as const),
});

const db = defineDb({ foo }, () => Promise.resolve({ rows: [], affectedCount: 0 }));
Expand Down Expand Up @@ -211,6 +213,7 @@ const db = defineDb({ foo }, () => Promise.resolve({ rows: [], affectedCount: 0
db.foo.txidSnapshot,
db.foo.uuid,
db.foo.xml,
db.foo.enumType,
)
.from(db.foo),
);
Expand Down
31 changes: 31 additions & 0 deletions src/__tests__/ddl.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { defineDb, defineTable, integer, text, timestampWithTimeZone, uuid } from '..';

import { enumType } from '../data-types';
import { table } from 'console';
import { toSnap } from './helpers';

Expand All @@ -9,6 +10,7 @@ describe(`ddl`, () => {
createDate: timestampWithTimeZone().notNull().default(`now()`),
name: text().notNull(),
value: integer(),
enumTest: enumType('my_enum_type', ['A', 'B', 'C']),
});

const db = defineDb(
Expand All @@ -29,6 +31,7 @@ describe(`ddl`, () => {
"checkExpression": undefined,
"dataType": "uuid",
"defaultExpression": "gen_random_uuid()",
"enumValues": undefined,
"isNotNull": false,
"isPrimaryKey": true,
"isUnique": false,
Expand All @@ -40,6 +43,7 @@ describe(`ddl`, () => {
"checkExpression": undefined,
"dataType": "timestamp with time zone",
"defaultExpression": "now()",
"enumValues": undefined,
"isNotNull": true,
"isPrimaryKey": false,
"isUnique": false,
Expand All @@ -51,6 +55,7 @@ describe(`ddl`, () => {
"checkExpression": undefined,
"dataType": "text",
"defaultExpression": undefined,
"enumValues": undefined,
"isNotNull": true,
"isPrimaryKey": false,
"isUnique": false,
Expand All @@ -62,13 +67,30 @@ describe(`ddl`, () => {
"checkExpression": undefined,
"dataType": "integer",
"defaultExpression": undefined,
"enumValues": undefined,
"isNotNull": false,
"isPrimaryKey": false,
"isUnique": false,
"name": "value",
"referencesColumn": undefined,
"referencesTable": undefined,
},
Object {
"checkExpression": undefined,
"dataType": "my_enum_type",
"defaultExpression": undefined,
"enumValues": Array [
"A",
"B",
"C",
],
"isNotNull": false,
"isPrimaryKey": false,
"isUnique": false,
"name": "enumTest",
"referencesColumn": undefined,
"referencesTable": undefined,
},
],
"name": "foo",
"originalDefinition": Object {
Expand All @@ -81,6 +103,15 @@ describe(`ddl`, () => {
"references": [Function],
"unique": [Function],
},
"enumTest": Object {
"check": [Function],
"default": [Function],
"getDefinition": [Function],
"notNull": [Function],
"primaryKey": [Function],
"references": [Function],
"unique": [Function],
},
"id": Object {
"check": [Function],
"default": [Function],
Expand Down
13 changes: 13 additions & 0 deletions src/__tests__/select.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import {

import { Query } from '../query';
import { ResultSet } from '../result-set';
import { enumType } from '../data-types';
import { toSnap } from './helpers';

describe(`select`, () => {
Expand All @@ -34,6 +35,7 @@ describe(`select`, () => {
createDate: timestampWithTimeZone().notNull().default(`now()`),
name: text().notNull(),
value: integer(),
enumTest: enumType('my_enum_type', ['A', 'B', 'C'] as const),
});

const bar = defineTable({
Expand Down Expand Up @@ -742,4 +744,15 @@ describe(`select`, () => {
}
`);
});

it(`should select enum column`, () => {
const query = db.select(db.foo.enumTest).from(db.foo);

expect(toSnap(query)).toMatchInlineSnapshot(`
Object {
"parameters": Array [],
"text": "SELECT foo.enum_test \\"enumTest\\" FROM foo",
}
`);
});
});
3 changes: 3 additions & 0 deletions src/column.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export interface ColumnDefinitionFormat {
isUnique: boolean;
referencesTable?: string;
referencesColumn?: string;
enumValues?: string[];
}

export interface ColumnDefinition<
Expand Down Expand Up @@ -50,6 +51,7 @@ export const makeColumnDefinition = <
HasDefault extends boolean = false
>(
dataType: string,
enumValues?: string[],
): ColumnDefinition<DataType, IsNotNull, HasDefault> => {
let isNotNull = false;
let isPrimaryKey = false;
Expand All @@ -70,6 +72,7 @@ export const makeColumnDefinition = <
isUnique,
referencesTable,
referencesColumn,
enumValues,
};
},

Expand Down
8 changes: 8 additions & 0 deletions src/data-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -332,3 +332,11 @@ export function xml<T>(): ColumnDefinition<T>;
export function xml() {
return makeDataType(`xml`);
}

// enum is a reserved keyword unfortunately
export function enumType<EnumValue>(
name: string,
values: readonly EnumValue[],
): ColumnDefinition<EnumValue> {
return makeDataType<EnumValue>(name, values as any);
}

0 comments on commit 86674ee

Please sign in to comment.