Add ColumnOf definitions

This commit is contained in:
Endeavorance 2025-04-06 17:08:35 -04:00
parent 59de642d31
commit 09d25c926c
4 changed files with 620 additions and 492 deletions

View file

@ -1,6 +1,6 @@
{ {
"name": "@endeavorance/prequel", "name": "@endeavorance/prequel",
"version": "1.2.0", "version": "1.4.0",
"exports": "./dist/index.js", "exports": "./dist/index.js",
"types": "./dist/index.d.ts", "types": "./dist/index.d.ts",
"scripts": { "scripts": {
@ -10,7 +10,9 @@
"keywords": [], "keywords": [],
"author": "Endeavorance <hello@endeavorance.camp> (https://endeavorance.camp)", "author": "Endeavorance <hello@endeavorance.camp> (https://endeavorance.camp)",
"license": "CC BY-NC-SA 4.0", "license": "CC BY-NC-SA 4.0",
"files": ["dist"], "files": [
"dist"
],
"type": "module", "type": "module",
"devDependencies": { "devDependencies": {
"@types/bun": "latest", "@types/bun": "latest",

115
src/column-types.ts Normal file
View file

@ -0,0 +1,115 @@
import type { ColumnShorthand } from "./columns";
import type { Table } from "./table";
export const ColumnOf = {
PrimaryKey: {
type: "INTEGER",
primary: true,
autoincrement: true,
},
Text: {
type: "TEXT",
nullable: false,
},
Int: {
type: "INTEGER",
nullable: false,
},
Real: {
type: "REAL",
nullable: false,
},
ForeignKey(otherTable: Table<unknown>, cascade = false): ColumnShorthand {
return {
type: otherTable.primaryColumnType(),
references: otherTable.reference(),
nullable: false,
cascade
};
},
Nullable: {
Text: {
type: "TEXT",
nullable: true,
},
Int: {
type: "INTEGER",
nullable: true,
},
Real: {
type: "REAL",
nullable: true,
},
ForeignKey(otherTable: Table<unknown>, cascade = false): ColumnShorthand {
return {
type: otherTable.primaryColumnType(),
references: otherTable.reference(),
nullable: true,
cascade,
};
},
},
Unique: {
Text: {
type: "TEXT",
nullable: false,
unique: true,
},
Int: {
type: "INTEGER",
nullable: false,
unique: true,
},
Real: {
type: "REAL",
nullable: false,
unique: true,
},
ForeignKey(otherTable: Table<unknown>, cascade = false): ColumnShorthand {
return {
type: otherTable.primaryColumnType(),
references: otherTable.reference(),
nullable: false,
unique: true,
cascade,
};
},
},
Defaulted: {
Text(defaultValue: string): ColumnShorthand {
return {
type: "TEXT",
default: defaultValue,
}
},
Int(defaultValue: number): ColumnShorthand {
return {
type: "INTEGER",
default: defaultValue,
} as const;
},
Real(defaultValue: number): ColumnShorthand {
return {
type: "REAL",
default: defaultValue,
} as const;
}
},
} as const;

View file

@ -1,5 +1,6 @@
import type { Column, ColumnShorthand, DataType } from "./columns"; import type { Column, ColumnShorthand, DataType } from "./columns";
import { Prequel } from "./prequel"; import { Prequel } from "./prequel";
import { Table } from "./table"; import { Table } from "./table";
import { ColumnOf } from "./column-types";
export { Prequel, Table, type DataType, type Column, type ColumnShorthand }; export { Prequel, Table, ColumnOf, type DataType, type Column, type ColumnShorthand };

View file

@ -2,6 +2,7 @@ import type { Database, Statement } from "bun:sqlite";
import { import {
type ColumnMap, type ColumnMap,
type ColumnShorthandMap, type ColumnShorthandMap,
type DataType,
generateColumnDefinitionSQL, generateColumnDefinitionSQL,
normalizeColumns, normalizeColumns,
} from "./columns"; } from "./columns";
@ -70,6 +71,7 @@ export class Table<RowShape> {
private _truncateQuery: Statement<void, []>; private _truncateQuery: Statement<void, []>;
public query: typeof Database.prototype.query; public query: typeof Database.prototype.query;
public prepare: typeof Database.prototype.prepare;
constructor( constructor(
db: Database | Prequel, db: Database | Prequel,
@ -84,7 +86,10 @@ export class Table<RowShape> {
this._name = name; this._name = name;
this._columnDefinitions = normalizeColumns(cols); this._columnDefinitions = normalizeColumns(cols);
this._columnNames = Object.keys(this._columnDefinitions); this._columnNames = Object.keys(this._columnDefinitions);
// Pass-thru functions
this.query = this._db.query.bind(this._db); this.query = this._db.query.bind(this._db);
this.prepare = this._db.prepare.bind(this._db);
const columnSQLParts: string[] = []; const columnSQLParts: string[] = [];
const updateColumnSQLParts: string[] = []; const updateColumnSQLParts: string[] = [];
@ -154,6 +159,11 @@ export class Table<RowShape> {
return this._columnNames.includes(colName); return this._columnNames.includes(colName);
} }
public primaryColumnType(): DataType {
const primary = this._primaryColumnName as keyof typeof this._columnDefinitions;
return this._columnDefinitions[primary].type;
}
/** /**
* Generates a reference string for a column in the table. * Generates a reference string for a column in the table.
* *