pims
Version:
An ORM for document-oriented database systems, written in and for TypeScript.
49 lines (42 loc) • 1.34 kB
text/typescript
import { createModelInfo, ModelInfo, modelInfoKey } from './model';
export interface ColumnInfo {
modelKey: string;
key: string;
tags: string[];
primary?: boolean;
secondary?: boolean;
computed?: boolean;
}
export function Column(info?: Partial<ColumnInfo>): any {
return (target: any, key: string, descriptor: PropertyDescriptor) => {
let computed = false;
if (descriptor) {
if (!descriptor.get) {
throw new Error('Cannot apply column decorator to methods');
}
computed = true;
}
const columnInfo: ColumnInfo = {
modelKey: String(key),
key: String(key),
tags: [],
computed,
...info,
};
const modelInfo: ModelInfo = createModelInfo(<any>target.constructor, {
columns: [columnInfo],
tags: new Map(
columnInfo.tags.map<[string, Set<string>]>(tag => [
tag,
new Set([columnInfo.key]),
]),
),
});
columnInfo.secondary &&
modelInfo.indexes.push({
name: columnInfo.key,
keys: [columnInfo.key],
});
columnInfo.primary && (modelInfo.primaryKey = columnInfo.key);
};
}