-
Notifications
You must be signed in to change notification settings - Fork 179
/
addConstraint.ts
69 lines (60 loc) · 1.96 KB
/
addConstraint.ts
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
import type { MigrationOptions } from '../../types';
import { formatLines } from '../../utils';
import type { Name, Reversible } from '../generalTypes';
import type { DropConstraintOptions } from './dropConstraint';
import { dropConstraint } from './dropConstraint';
import type { ConstraintOptions } from './shared';
import { parseConstraints } from './shared';
export type CreateConstraintFn = (
tableName: Name,
constraintName: string | null,
constraintExpressionOrOptions:
| (ConstraintOptions & DropConstraintOptions)
| string
) => string;
export type CreateConstraint = Reversible<CreateConstraintFn>;
export function addConstraint(mOptions: MigrationOptions): CreateConstraint {
const _add: CreateConstraint = (
tableName,
constraintName,
expressionOrOptions
) => {
const { constraints, comments } =
typeof expressionOrOptions === 'string'
? {
constraints: [
`${constraintName ? `CONSTRAINT ${mOptions.literal(constraintName)} ` : ''}${expressionOrOptions}`,
],
comments: [],
}
: parseConstraints(
tableName,
expressionOrOptions,
constraintName,
mOptions.literal
);
const constraintStr = formatLines(constraints, ' ADD ');
return [
`ALTER TABLE ${mOptions.literal(tableName)}\n${constraintStr};`,
...comments,
].join('\n');
};
_add.reverse = (tableName, constraintName, expressionOrOptions) => {
if (constraintName === null) {
throw new Error(
'Impossible to automatically infer down migration for addConstraint without naming constraint'
);
}
if (typeof expressionOrOptions === 'string') {
throw new Error(
'Impossible to automatically infer down migration for addConstraint with raw SQL expression'
);
}
return dropConstraint(mOptions)(
tableName,
constraintName,
expressionOrOptions
);
};
return _add;
}