@remix-run/data-table 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +298 -2
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/lib/adapter.d.ts +180 -0
- package/dist/lib/adapter.d.ts.map +1 -0
- package/dist/lib/adapter.js +1 -0
- package/dist/lib/database.d.ts +361 -0
- package/dist/lib/database.d.ts.map +1 -0
- package/dist/lib/database.js +1368 -0
- package/dist/lib/errors.d.ts +50 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +67 -0
- package/dist/lib/inflection.d.ts +3 -0
- package/dist/lib/inflection.d.ts.map +1 -0
- package/dist/lib/inflection.js +56 -0
- package/dist/lib/operators.d.ts +151 -0
- package/dist/lib/operators.d.ts.map +1 -0
- package/dist/lib/operators.js +218 -0
- package/dist/lib/references.d.ts +42 -0
- package/dist/lib/references.d.ts.map +1 -0
- package/dist/lib/references.js +33 -0
- package/dist/lib/sql.d.ts +28 -0
- package/dist/lib/sql.d.ts.map +1 -0
- package/dist/lib/sql.js +51 -0
- package/dist/lib/table.d.ts +254 -0
- package/dist/lib/table.d.ts.map +1 -0
- package/dist/lib/table.js +496 -0
- package/dist/lib/types.d.ts +4 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +1 -0
- package/package.json +41 -7
- package/src/index.ts +115 -0
- package/src/lib/adapter.ts +209 -0
- package/src/lib/database.ts +2458 -0
- package/src/lib/errors.ts +109 -0
- package/src/lib/inflection.ts +69 -0
- package/src/lib/operators.ts +433 -0
- package/src/lib/references.ts +79 -0
- package/src/lib/sql.ts +67 -0
- package/src/lib/table.ts +981 -0
- package/src/lib/types.ts +3 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error for all `data-table` failures.
|
|
3
|
+
*/
|
|
4
|
+
export declare class DataTableError extends Error {
|
|
5
|
+
code: string;
|
|
6
|
+
metadata?: Record<string, unknown>;
|
|
7
|
+
constructor(message: string, options?: {
|
|
8
|
+
code?: string;
|
|
9
|
+
cause?: unknown;
|
|
10
|
+
metadata?: Record<string, unknown>;
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Thrown when input data fails schema validation.
|
|
15
|
+
*/
|
|
16
|
+
export declare class DataTableValidationError extends DataTableError {
|
|
17
|
+
issues: ReadonlyArray<unknown>;
|
|
18
|
+
constructor(message: string, issues: ReadonlyArray<unknown>, options?: {
|
|
19
|
+
cause?: unknown;
|
|
20
|
+
metadata?: Record<string, unknown>;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Thrown when a query is invalid for the current builder state.
|
|
25
|
+
*/
|
|
26
|
+
export declare class DataTableQueryError extends DataTableError {
|
|
27
|
+
constructor(message: string, options?: {
|
|
28
|
+
cause?: unknown;
|
|
29
|
+
metadata?: Record<string, unknown>;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Thrown when adapter execution fails.
|
|
34
|
+
*/
|
|
35
|
+
export declare class DataTableAdapterError extends DataTableError {
|
|
36
|
+
constructor(message: string, options?: {
|
|
37
|
+
cause?: unknown;
|
|
38
|
+
metadata?: Record<string, unknown>;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Thrown when a database constraint is violated.
|
|
43
|
+
*/
|
|
44
|
+
export declare class DataTableConstraintError extends DataTableError {
|
|
45
|
+
constructor(message: string, options?: {
|
|
46
|
+
cause?: unknown;
|
|
47
|
+
metadata?: Record<string, unknown>;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAElC,YACE,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACnC,EAMF;CACF;AAED;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,cAAc;IAC1D,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;IAE9B,YACE,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,EAC9B,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACnC,EAUF;CACF;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,cAAc;IACrD,YACE,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACnC,EASF;CACF;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,cAAc;IACvD,YACE,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACnC,EASF;CACF;AAED;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,cAAc;IAC1D,YACE,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,OAAO,CAAA;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACnC,EASF;CACF"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error for all `data-table` failures.
|
|
3
|
+
*/
|
|
4
|
+
export class DataTableError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
metadata;
|
|
7
|
+
constructor(message, options) {
|
|
8
|
+
super(message, { cause: options?.cause });
|
|
9
|
+
this.name = 'DataTableError';
|
|
10
|
+
this.code = options?.code ?? 'DATA_TABLE_ERROR';
|
|
11
|
+
this.metadata = options?.metadata;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Thrown when input data fails schema validation.
|
|
16
|
+
*/
|
|
17
|
+
export class DataTableValidationError extends DataTableError {
|
|
18
|
+
issues;
|
|
19
|
+
constructor(message, issues, options) {
|
|
20
|
+
super(message, {
|
|
21
|
+
code: 'DATA_TABLE_VALIDATION_ERROR',
|
|
22
|
+
cause: options?.cause,
|
|
23
|
+
metadata: options?.metadata,
|
|
24
|
+
});
|
|
25
|
+
this.name = 'DataTableValidationError';
|
|
26
|
+
this.issues = issues;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Thrown when a query is invalid for the current builder state.
|
|
31
|
+
*/
|
|
32
|
+
export class DataTableQueryError extends DataTableError {
|
|
33
|
+
constructor(message, options) {
|
|
34
|
+
super(message, {
|
|
35
|
+
code: 'DATA_TABLE_QUERY_ERROR',
|
|
36
|
+
cause: options?.cause,
|
|
37
|
+
metadata: options?.metadata,
|
|
38
|
+
});
|
|
39
|
+
this.name = 'DataTableQueryError';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Thrown when adapter execution fails.
|
|
44
|
+
*/
|
|
45
|
+
export class DataTableAdapterError extends DataTableError {
|
|
46
|
+
constructor(message, options) {
|
|
47
|
+
super(message, {
|
|
48
|
+
code: 'DATA_TABLE_ADAPTER_ERROR',
|
|
49
|
+
cause: options?.cause,
|
|
50
|
+
metadata: options?.metadata,
|
|
51
|
+
});
|
|
52
|
+
this.name = 'DataTableAdapterError';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Thrown when a database constraint is violated.
|
|
57
|
+
*/
|
|
58
|
+
export class DataTableConstraintError extends DataTableError {
|
|
59
|
+
constructor(message, options) {
|
|
60
|
+
super(message, {
|
|
61
|
+
code: 'DATA_TABLE_CONSTRAINT_ERROR',
|
|
62
|
+
cause: options?.cause,
|
|
63
|
+
metadata: options?.metadata,
|
|
64
|
+
});
|
|
65
|
+
this.name = 'DataTableConstraintError';
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inflection.d.ts","sourceRoot":"","sources":["../../src/lib/inflection.ts"],"names":[],"mappings":"AAoBA,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAwBhD;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAUzD"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
const IRREGULAR_SINGULAR_FORMS = {
|
|
2
|
+
people: 'person',
|
|
3
|
+
men: 'man',
|
|
4
|
+
women: 'woman',
|
|
5
|
+
children: 'child',
|
|
6
|
+
teeth: 'tooth',
|
|
7
|
+
feet: 'foot',
|
|
8
|
+
geese: 'goose',
|
|
9
|
+
mice: 'mouse',
|
|
10
|
+
data: 'datum',
|
|
11
|
+
media: 'medium',
|
|
12
|
+
indices: 'index',
|
|
13
|
+
vertices: 'vertex',
|
|
14
|
+
analyses: 'analysis',
|
|
15
|
+
statuses: 'status',
|
|
16
|
+
categories: 'category',
|
|
17
|
+
companies: 'company',
|
|
18
|
+
addresses: 'address',
|
|
19
|
+
};
|
|
20
|
+
export function singularize(word) {
|
|
21
|
+
let lower = word.toLowerCase();
|
|
22
|
+
if (IRREGULAR_SINGULAR_FORMS[lower]) {
|
|
23
|
+
return preserveCase(word, IRREGULAR_SINGULAR_FORMS[lower]);
|
|
24
|
+
}
|
|
25
|
+
if (lower.endsWith('ies') && lower.length > 3) {
|
|
26
|
+
return preserveCase(word, word.slice(0, -3) + 'y');
|
|
27
|
+
}
|
|
28
|
+
if (lower.endsWith('sses') || lower.endsWith('shes') || lower.endsWith('ches')) {
|
|
29
|
+
return preserveCase(word, word.slice(0, -2));
|
|
30
|
+
}
|
|
31
|
+
if (lower.endsWith('xes') || lower.endsWith('zes')) {
|
|
32
|
+
return preserveCase(word, word.slice(0, -2));
|
|
33
|
+
}
|
|
34
|
+
if (lower.endsWith('s') && !lower.endsWith('ss')) {
|
|
35
|
+
return preserveCase(word, word.slice(0, -1));
|
|
36
|
+
}
|
|
37
|
+
return word;
|
|
38
|
+
}
|
|
39
|
+
export function inferForeignKey(tableName) {
|
|
40
|
+
let segments = tableName.split('_');
|
|
41
|
+
let tail = segments.pop() ?? tableName;
|
|
42
|
+
let singularTail = singularize(tail);
|
|
43
|
+
if (segments.length === 0) {
|
|
44
|
+
return singularTail + '_id';
|
|
45
|
+
}
|
|
46
|
+
return [...segments, singularTail + '_id'].join('_');
|
|
47
|
+
}
|
|
48
|
+
function preserveCase(source, replacement) {
|
|
49
|
+
if (source.length === 0) {
|
|
50
|
+
return replacement;
|
|
51
|
+
}
|
|
52
|
+
if (source[0] === source[0].toUpperCase()) {
|
|
53
|
+
return replacement[0].toUpperCase() + replacement.slice(1);
|
|
54
|
+
}
|
|
55
|
+
return replacement;
|
|
56
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import type { ColumnInput, ColumnReferenceLike, NormalizeColumnInput } from './references.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Comparison operators supported by `comparison` predicates.
|
|
4
|
+
*/
|
|
5
|
+
export type ComparisonOperator = 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte' | 'in' | 'notIn' | 'like' | 'ilike';
|
|
6
|
+
type QualifiedColumnReference = `${string}.${string}`;
|
|
7
|
+
type PredicateColumn<input extends string | ColumnReferenceLike> = NormalizeColumnInput<input> & string;
|
|
8
|
+
/**
|
|
9
|
+
* Normalized predicate representation consumed by adapters.
|
|
10
|
+
*/
|
|
11
|
+
export type Predicate<column extends string = string> = {
|
|
12
|
+
type: 'comparison';
|
|
13
|
+
operator: ComparisonOperator;
|
|
14
|
+
column: column;
|
|
15
|
+
value: unknown;
|
|
16
|
+
valueType: 'value';
|
|
17
|
+
} | {
|
|
18
|
+
type: 'comparison';
|
|
19
|
+
operator: Exclude<ComparisonOperator, 'in' | 'notIn'>;
|
|
20
|
+
column: column;
|
|
21
|
+
value: column;
|
|
22
|
+
valueType: 'column';
|
|
23
|
+
} | {
|
|
24
|
+
type: 'between';
|
|
25
|
+
column: column;
|
|
26
|
+
lower: unknown;
|
|
27
|
+
upper: unknown;
|
|
28
|
+
} | {
|
|
29
|
+
type: 'null';
|
|
30
|
+
operator: 'isNull' | 'notNull';
|
|
31
|
+
column: column;
|
|
32
|
+
} | {
|
|
33
|
+
type: 'logical';
|
|
34
|
+
operator: 'and' | 'or';
|
|
35
|
+
predicates: Predicate<column>[];
|
|
36
|
+
};
|
|
37
|
+
export type WhereObject<column extends string = string> = Partial<Record<column, unknown>>;
|
|
38
|
+
/**
|
|
39
|
+
* User-facing where input accepted by `query.where()` and relation modifiers.
|
|
40
|
+
*/
|
|
41
|
+
export type WhereInput<column extends string = string> = Predicate<column> | WhereObject<column>;
|
|
42
|
+
/**
|
|
43
|
+
* Builds an equality predicate.
|
|
44
|
+
*/
|
|
45
|
+
export declare function eq<left extends ColumnInput<QualifiedColumnReference>, right extends ColumnInput<QualifiedColumnReference>>(column: left, value: right & (right extends `${string}@${string}` ? never : right)): Predicate<PredicateColumn<left> | PredicateColumn<right>>;
|
|
46
|
+
export declare function eq<column extends string | ColumnReferenceLike>(column: column, value: unknown): Predicate<PredicateColumn<column>>;
|
|
47
|
+
/**
|
|
48
|
+
* Builds an inequality predicate.
|
|
49
|
+
*/
|
|
50
|
+
export declare function ne<left extends ColumnInput<QualifiedColumnReference>, right extends ColumnInput<QualifiedColumnReference>>(column: left, value: right & (right extends `${string}@${string}` ? never : right)): Predicate<PredicateColumn<left> | PredicateColumn<right>>;
|
|
51
|
+
export declare function ne<column extends string | ColumnReferenceLike>(column: column, value: unknown): Predicate<PredicateColumn<column>>;
|
|
52
|
+
/**
|
|
53
|
+
* Builds a greater-than predicate.
|
|
54
|
+
*/
|
|
55
|
+
export declare function gt<left extends ColumnInput<QualifiedColumnReference>, right extends ColumnInput<QualifiedColumnReference>>(column: left, value: right & (right extends `${string}@${string}` ? never : right)): Predicate<PredicateColumn<left> | PredicateColumn<right>>;
|
|
56
|
+
export declare function gt<column extends string | ColumnReferenceLike>(column: column, value: unknown): Predicate<PredicateColumn<column>>;
|
|
57
|
+
/**
|
|
58
|
+
* Builds a greater-than-or-equal predicate.
|
|
59
|
+
*/
|
|
60
|
+
export declare function gte<left extends ColumnInput<QualifiedColumnReference>, right extends ColumnInput<QualifiedColumnReference>>(column: left, value: right & (right extends `${string}@${string}` ? never : right)): Predicate<PredicateColumn<left> | PredicateColumn<right>>;
|
|
61
|
+
export declare function gte<column extends string | ColumnReferenceLike>(column: column, value: unknown): Predicate<PredicateColumn<column>>;
|
|
62
|
+
/**
|
|
63
|
+
* Builds a less-than predicate.
|
|
64
|
+
*/
|
|
65
|
+
export declare function lt<left extends ColumnInput<QualifiedColumnReference>, right extends ColumnInput<QualifiedColumnReference>>(column: left, value: right & (right extends `${string}@${string}` ? never : right)): Predicate<PredicateColumn<left> | PredicateColumn<right>>;
|
|
66
|
+
export declare function lt<column extends string | ColumnReferenceLike>(column: column, value: unknown): Predicate<PredicateColumn<column>>;
|
|
67
|
+
/**
|
|
68
|
+
* Builds a less-than-or-equal predicate.
|
|
69
|
+
*/
|
|
70
|
+
export declare function lte<left extends ColumnInput<QualifiedColumnReference>, right extends ColumnInput<QualifiedColumnReference>>(column: left, value: right & (right extends `${string}@${string}` ? never : right)): Predicate<PredicateColumn<left> | PredicateColumn<right>>;
|
|
71
|
+
export declare function lte<column extends string | ColumnReferenceLike>(column: column, value: unknown): Predicate<PredicateColumn<column>>;
|
|
72
|
+
/**
|
|
73
|
+
* Builds an `IN` predicate.
|
|
74
|
+
* @param column Column to compare.
|
|
75
|
+
* @param values Candidate values.
|
|
76
|
+
* @returns An `in` comparison predicate.
|
|
77
|
+
*/
|
|
78
|
+
export declare function inList<column extends string | ColumnReferenceLike>(column: column, values: readonly unknown[]): Predicate<PredicateColumn<column>>;
|
|
79
|
+
/**
|
|
80
|
+
* Builds a `NOT IN` predicate.
|
|
81
|
+
* @param column Column to compare.
|
|
82
|
+
* @param values Candidate values.
|
|
83
|
+
* @returns A `notIn` comparison predicate.
|
|
84
|
+
*/
|
|
85
|
+
export declare function notInList<column extends string | ColumnReferenceLike>(column: column, values: readonly unknown[]): Predicate<PredicateColumn<column>>;
|
|
86
|
+
/**
|
|
87
|
+
* Builds a case-sensitive SQL `LIKE` predicate.
|
|
88
|
+
* @param column Column to compare.
|
|
89
|
+
* @param value Match pattern.
|
|
90
|
+
* @returns A `like` comparison predicate.
|
|
91
|
+
*/
|
|
92
|
+
export declare function like<column extends string | ColumnReferenceLike>(column: column, value: string): Predicate<PredicateColumn<column>>;
|
|
93
|
+
/**
|
|
94
|
+
* Builds a case-insensitive SQL `LIKE` predicate.
|
|
95
|
+
* @param column Column to compare.
|
|
96
|
+
* @param value Match pattern.
|
|
97
|
+
* @returns An `ilike` comparison predicate.
|
|
98
|
+
*/
|
|
99
|
+
export declare function ilike<column extends string | ColumnReferenceLike>(column: column, value: string): Predicate<PredicateColumn<column>>;
|
|
100
|
+
/**
|
|
101
|
+
* Builds a `BETWEEN` predicate.
|
|
102
|
+
* @param column Column to compare.
|
|
103
|
+
* @param lower Lower bound value.
|
|
104
|
+
* @param upper Upper bound value.
|
|
105
|
+
* @returns A `between` predicate.
|
|
106
|
+
*/
|
|
107
|
+
export declare function between<column extends string | ColumnReferenceLike>(column: column, lower: unknown, upper: unknown): Predicate<PredicateColumn<column>>;
|
|
108
|
+
/**
|
|
109
|
+
* Builds an `IS NULL` predicate.
|
|
110
|
+
* @param column Column to compare.
|
|
111
|
+
* @returns An `isNull` predicate.
|
|
112
|
+
*/
|
|
113
|
+
export declare function isNull<column extends string | ColumnReferenceLike>(column: column): Predicate<PredicateColumn<column>>;
|
|
114
|
+
/**
|
|
115
|
+
* Builds an `IS NOT NULL` predicate.
|
|
116
|
+
* @param column Column to compare.
|
|
117
|
+
* @returns A `notNull` predicate.
|
|
118
|
+
*/
|
|
119
|
+
export declare function notNull<column extends string | ColumnReferenceLike>(column: column): Predicate<PredicateColumn<column>>;
|
|
120
|
+
/**
|
|
121
|
+
* Combines predicates with logical `AND`.
|
|
122
|
+
* @param predicates Child predicates.
|
|
123
|
+
* @returns A logical `and` predicate.
|
|
124
|
+
*/
|
|
125
|
+
export declare function and<column extends string>(...predicates: Predicate<column>[]): Predicate<column>;
|
|
126
|
+
/**
|
|
127
|
+
* Combines predicates with logical `OR`.
|
|
128
|
+
* @param predicates Child predicates.
|
|
129
|
+
* @returns A logical `or` predicate.
|
|
130
|
+
*/
|
|
131
|
+
export declare function or<column extends string>(...predicates: Predicate<column>[]): Predicate<column>;
|
|
132
|
+
/**
|
|
133
|
+
* Returns `true` when a value is a normalized predicate object.
|
|
134
|
+
* @param value Value to inspect.
|
|
135
|
+
* @returns Whether the value is a predicate.
|
|
136
|
+
*/
|
|
137
|
+
export declare function isPredicate<column extends string = string>(value: unknown): value is Predicate<column>;
|
|
138
|
+
/**
|
|
139
|
+
* Normalizes object shorthand into a predicate tree.
|
|
140
|
+
* @param input Predicate object or shorthand where map.
|
|
141
|
+
* @returns A normalized predicate.
|
|
142
|
+
*/
|
|
143
|
+
export declare function normalizeWhereInput<column extends string>(input: WhereInput<column>): Predicate<column>;
|
|
144
|
+
/**
|
|
145
|
+
* Collects referenced columns from a predicate tree.
|
|
146
|
+
* @param predicate Predicate to inspect.
|
|
147
|
+
* @returns Referenced column names.
|
|
148
|
+
*/
|
|
149
|
+
export declare function getPredicateColumns(predicate: Predicate): string[];
|
|
150
|
+
export {};
|
|
151
|
+
//# sourceMappingURL=operators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operators.d.ts","sourceRoot":"","sources":["../../src/lib/operators.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { isColumnReference, normalizeColumnInput } from "./references.js";
|
|
2
|
+
export function eq(column, value) {
|
|
3
|
+
return createComparisonPredicate('eq', column, value);
|
|
4
|
+
}
|
|
5
|
+
export function ne(column, value) {
|
|
6
|
+
return createComparisonPredicate('ne', column, value);
|
|
7
|
+
}
|
|
8
|
+
export function gt(column, value) {
|
|
9
|
+
return createComparisonPredicate('gt', column, value);
|
|
10
|
+
}
|
|
11
|
+
export function gte(column, value) {
|
|
12
|
+
return createComparisonPredicate('gte', column, value);
|
|
13
|
+
}
|
|
14
|
+
export function lt(column, value) {
|
|
15
|
+
return createComparisonPredicate('lt', column, value);
|
|
16
|
+
}
|
|
17
|
+
export function lte(column, value) {
|
|
18
|
+
return createComparisonPredicate('lte', column, value);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Builds an `IN` predicate.
|
|
22
|
+
* @param column Column to compare.
|
|
23
|
+
* @param values Candidate values.
|
|
24
|
+
* @returns An `in` comparison predicate.
|
|
25
|
+
*/
|
|
26
|
+
export function inList(column, values) {
|
|
27
|
+
return {
|
|
28
|
+
type: 'comparison',
|
|
29
|
+
operator: 'in',
|
|
30
|
+
column: resolvePredicateColumn(column),
|
|
31
|
+
value: [...values],
|
|
32
|
+
valueType: 'value',
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Builds a `NOT IN` predicate.
|
|
37
|
+
* @param column Column to compare.
|
|
38
|
+
* @param values Candidate values.
|
|
39
|
+
* @returns A `notIn` comparison predicate.
|
|
40
|
+
*/
|
|
41
|
+
export function notInList(column, values) {
|
|
42
|
+
return {
|
|
43
|
+
type: 'comparison',
|
|
44
|
+
operator: 'notIn',
|
|
45
|
+
column: resolvePredicateColumn(column),
|
|
46
|
+
value: [...values],
|
|
47
|
+
valueType: 'value',
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Builds a case-sensitive SQL `LIKE` predicate.
|
|
52
|
+
* @param column Column to compare.
|
|
53
|
+
* @param value Match pattern.
|
|
54
|
+
* @returns A `like` comparison predicate.
|
|
55
|
+
*/
|
|
56
|
+
export function like(column, value) {
|
|
57
|
+
return {
|
|
58
|
+
type: 'comparison',
|
|
59
|
+
operator: 'like',
|
|
60
|
+
column: resolvePredicateColumn(column),
|
|
61
|
+
value,
|
|
62
|
+
valueType: 'value',
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Builds a case-insensitive SQL `LIKE` predicate.
|
|
67
|
+
* @param column Column to compare.
|
|
68
|
+
* @param value Match pattern.
|
|
69
|
+
* @returns An `ilike` comparison predicate.
|
|
70
|
+
*/
|
|
71
|
+
export function ilike(column, value) {
|
|
72
|
+
return {
|
|
73
|
+
type: 'comparison',
|
|
74
|
+
operator: 'ilike',
|
|
75
|
+
column: resolvePredicateColumn(column),
|
|
76
|
+
value,
|
|
77
|
+
valueType: 'value',
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Builds a `BETWEEN` predicate.
|
|
82
|
+
* @param column Column to compare.
|
|
83
|
+
* @param lower Lower bound value.
|
|
84
|
+
* @param upper Upper bound value.
|
|
85
|
+
* @returns A `between` predicate.
|
|
86
|
+
*/
|
|
87
|
+
export function between(column, lower, upper) {
|
|
88
|
+
return {
|
|
89
|
+
type: 'between',
|
|
90
|
+
column: resolvePredicateColumn(column),
|
|
91
|
+
lower,
|
|
92
|
+
upper,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Builds an `IS NULL` predicate.
|
|
97
|
+
* @param column Column to compare.
|
|
98
|
+
* @returns An `isNull` predicate.
|
|
99
|
+
*/
|
|
100
|
+
export function isNull(column) {
|
|
101
|
+
return { type: 'null', operator: 'isNull', column: resolvePredicateColumn(column) };
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Builds an `IS NOT NULL` predicate.
|
|
105
|
+
* @param column Column to compare.
|
|
106
|
+
* @returns A `notNull` predicate.
|
|
107
|
+
*/
|
|
108
|
+
export function notNull(column) {
|
|
109
|
+
return { type: 'null', operator: 'notNull', column: resolvePredicateColumn(column) };
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Combines predicates with logical `AND`.
|
|
113
|
+
* @param predicates Child predicates.
|
|
114
|
+
* @returns A logical `and` predicate.
|
|
115
|
+
*/
|
|
116
|
+
export function and(...predicates) {
|
|
117
|
+
let filtered = predicates.filter(Boolean);
|
|
118
|
+
return { type: 'logical', operator: 'and', predicates: filtered };
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Combines predicates with logical `OR`.
|
|
122
|
+
* @param predicates Child predicates.
|
|
123
|
+
* @returns A logical `or` predicate.
|
|
124
|
+
*/
|
|
125
|
+
export function or(...predicates) {
|
|
126
|
+
let filtered = predicates.filter(Boolean);
|
|
127
|
+
return { type: 'logical', operator: 'or', predicates: filtered };
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Returns `true` when a value is a normalized predicate object.
|
|
131
|
+
* @param value Value to inspect.
|
|
132
|
+
* @returns Whether the value is a predicate.
|
|
133
|
+
*/
|
|
134
|
+
export function isPredicate(value) {
|
|
135
|
+
if (typeof value !== 'object' || value === null) {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
if (!('type' in value)) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
let input = value;
|
|
142
|
+
return (input.type === 'comparison' ||
|
|
143
|
+
input.type === 'between' ||
|
|
144
|
+
input.type === 'null' ||
|
|
145
|
+
input.type === 'logical');
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Normalizes object shorthand into a predicate tree.
|
|
149
|
+
* @param input Predicate object or shorthand where map.
|
|
150
|
+
* @returns A normalized predicate.
|
|
151
|
+
*/
|
|
152
|
+
export function normalizeWhereInput(input) {
|
|
153
|
+
if (isPredicate(input)) {
|
|
154
|
+
return input;
|
|
155
|
+
}
|
|
156
|
+
let keys = Object.keys(input);
|
|
157
|
+
let predicates = keys.map((column) => eq(column, input[column]));
|
|
158
|
+
return and(...predicates);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Collects referenced columns from a predicate tree.
|
|
162
|
+
* @param predicate Predicate to inspect.
|
|
163
|
+
* @returns Referenced column names.
|
|
164
|
+
*/
|
|
165
|
+
export function getPredicateColumns(predicate) {
|
|
166
|
+
if (predicate.type === 'comparison') {
|
|
167
|
+
if (predicate.valueType === 'column') {
|
|
168
|
+
return [predicate.column, predicate.value];
|
|
169
|
+
}
|
|
170
|
+
return [predicate.column];
|
|
171
|
+
}
|
|
172
|
+
if (predicate.type === 'between') {
|
|
173
|
+
return [predicate.column];
|
|
174
|
+
}
|
|
175
|
+
if (predicate.type === 'null') {
|
|
176
|
+
return [predicate.column];
|
|
177
|
+
}
|
|
178
|
+
let columns = [];
|
|
179
|
+
for (let child of predicate.predicates) {
|
|
180
|
+
columns.push(...getPredicateColumns(child));
|
|
181
|
+
}
|
|
182
|
+
return columns;
|
|
183
|
+
}
|
|
184
|
+
function isQualifiedColumnReference(value) {
|
|
185
|
+
if (typeof value !== 'string') {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
return /^[a-zA-Z_][a-zA-Z0-9_]*(\.[a-zA-Z_][a-zA-Z0-9_]*)+$/.test(value);
|
|
189
|
+
}
|
|
190
|
+
function resolvePredicateColumn(column) {
|
|
191
|
+
return normalizeColumnInput(column);
|
|
192
|
+
}
|
|
193
|
+
function resolveComparisonValue(value) {
|
|
194
|
+
if (isColumnReference(value)) {
|
|
195
|
+
return normalizeColumnInput(value);
|
|
196
|
+
}
|
|
197
|
+
return value;
|
|
198
|
+
}
|
|
199
|
+
function createComparisonPredicate(operator, column, value) {
|
|
200
|
+
let normalizedColumn = resolvePredicateColumn(column);
|
|
201
|
+
let normalizedValue = resolveComparisonValue(value);
|
|
202
|
+
if (isQualifiedColumnReference(normalizedColumn) && isQualifiedColumnReference(normalizedValue)) {
|
|
203
|
+
return {
|
|
204
|
+
type: 'comparison',
|
|
205
|
+
operator,
|
|
206
|
+
column: normalizedColumn,
|
|
207
|
+
value: normalizedValue,
|
|
208
|
+
valueType: 'column',
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
return {
|
|
212
|
+
type: 'comparison',
|
|
213
|
+
operator,
|
|
214
|
+
column: normalizedColumn,
|
|
215
|
+
value: normalizedValue,
|
|
216
|
+
valueType: 'value',
|
|
217
|
+
};
|
|
218
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Symbol key used to store non-enumerable table metadata.
|
|
3
|
+
*/
|
|
4
|
+
export declare const tableMetadataKey: unique symbol;
|
|
5
|
+
/**
|
|
6
|
+
* Symbol key used to store non-enumerable column metadata.
|
|
7
|
+
*/
|
|
8
|
+
export declare const columnMetadataKey: unique symbol;
|
|
9
|
+
type UnknownTableMetadata<name extends string = string, columns extends Record<string, unknown> = Record<string, unknown>, primaryKey extends readonly string[] = readonly string[], timestamps = unknown> = {
|
|
10
|
+
name: name;
|
|
11
|
+
columns: columns;
|
|
12
|
+
primaryKey: primaryKey;
|
|
13
|
+
timestamps: timestamps;
|
|
14
|
+
};
|
|
15
|
+
export type TableMetadataLike<name extends string = string, columns extends Record<string, unknown> = Record<string, unknown>, primaryKey extends readonly string[] = readonly string[], timestamps = unknown> = {
|
|
16
|
+
[tableMetadataKey]: UnknownTableMetadata<name, columns, primaryKey, timestamps>;
|
|
17
|
+
};
|
|
18
|
+
export type ColumnReferenceLike<qualifiedName extends string = string> = {
|
|
19
|
+
kind: 'column';
|
|
20
|
+
[columnMetadataKey]: {
|
|
21
|
+
tableName: string;
|
|
22
|
+
columnName: string;
|
|
23
|
+
qualifiedName: qualifiedName;
|
|
24
|
+
schema: unknown;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
export type ColumnInput<qualifiedName extends string = string> = qualifiedName | ColumnReferenceLike<qualifiedName>;
|
|
28
|
+
export type NormalizeColumnInput<input> = input extends ColumnReferenceLike<infer qualifiedName> ? qualifiedName : input;
|
|
29
|
+
/**
|
|
30
|
+
* Returns `true` when a value is a `data-table` column reference.
|
|
31
|
+
* @param value Value to inspect.
|
|
32
|
+
* @returns Whether the value is a column reference object.
|
|
33
|
+
*/
|
|
34
|
+
export declare function isColumnReference(value: unknown): value is ColumnReferenceLike;
|
|
35
|
+
/**
|
|
36
|
+
* Normalizes string/column-reference inputs to a qualified column name.
|
|
37
|
+
* @param input Column name or column reference.
|
|
38
|
+
* @returns The normalized qualified column name.
|
|
39
|
+
*/
|
|
40
|
+
export declare function normalizeColumnInput<input extends string | ColumnReferenceLike>(input: input): NormalizeColumnInput<input>;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=references.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"references.d.ts","sourceRoot":"","sources":["../../src/lib/references.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,gBAAgB,eAAqC,CAAA;AAElE;;GAEG;AACH,eAAO,MAAM,iBAAiB,eAAsC,CAAA;AAEpE,KAAK,oBAAoB,CACvB,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,UAAU,SAAS,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,EACxD,UAAU,GAAG,OAAO,IAClB;IACF,IAAI,EAAE,IAAI,CAAA;IACV,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,UAAU,CAAA;IACtB,UAAU,EAAE,UAAU,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,iBAAiB,CAC3B,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,UAAU,SAAS,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,EACxD,UAAU,GAAG,OAAO,IAClB;IACF,CAAC,gBAAgB,CAAC,EAAE,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;CAChF,CAAA;AAED,MAAM,MAAM,mBAAmB,CAAC,aAAa,SAAS,MAAM,GAAG,MAAM,IAAI;IACvE,IAAI,EAAE,QAAQ,CAAA;IACd,CAAC,iBAAiB,CAAC,EAAE;QACnB,SAAS,EAAE,MAAM,CAAA;QACjB,UAAU,EAAE,MAAM,CAAA;QAClB,aAAa,EAAE,aAAa,CAAA;QAC5B,MAAM,EAAE,OAAO,CAAA;KAChB,CAAA;CACF,CAAA;AAED,MAAM,MAAM,WAAW,CAAC,aAAa,SAAS,MAAM,GAAG,MAAM,IACzD,aAAa,GACb,mBAAmB,CAAC,aAAa,CAAC,CAAA;AAEtC,MAAM,MAAM,oBAAoB,CAAC,KAAK,IACpC,KAAK,SAAS,mBAAmB,CAAC,MAAM,aAAa,CAAC,GAAG,aAAa,GAAG,KAAK,CAAA;AAEhF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAU9E;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,SAAS,MAAM,GAAG,mBAAmB,EAC7E,KAAK,EAAE,KAAK,GACX,oBAAoB,CAAC,KAAK,CAAC,CAM7B"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Symbol key used to store non-enumerable table metadata.
|
|
3
|
+
*/
|
|
4
|
+
export const tableMetadataKey = Symbol('data-table.tableMetadata');
|
|
5
|
+
/**
|
|
6
|
+
* Symbol key used to store non-enumerable column metadata.
|
|
7
|
+
*/
|
|
8
|
+
export const columnMetadataKey = Symbol('data-table.columnMetadata');
|
|
9
|
+
/**
|
|
10
|
+
* Returns `true` when a value is a `data-table` column reference.
|
|
11
|
+
* @param value Value to inspect.
|
|
12
|
+
* @returns Whether the value is a column reference object.
|
|
13
|
+
*/
|
|
14
|
+
export function isColumnReference(value) {
|
|
15
|
+
if (typeof value !== 'object' || value === null) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
if (!('kind' in value) || value.kind !== 'column') {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
return columnMetadataKey in value;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Normalizes string/column-reference inputs to a qualified column name.
|
|
25
|
+
* @param input Column name or column reference.
|
|
26
|
+
* @returns The normalized qualified column name.
|
|
27
|
+
*/
|
|
28
|
+
export function normalizeColumnInput(input) {
|
|
29
|
+
if (typeof input === 'string') {
|
|
30
|
+
return input;
|
|
31
|
+
}
|
|
32
|
+
return input[columnMetadataKey].qualifiedName;
|
|
33
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parameterized SQL payload with positional `?` placeholders.
|
|
3
|
+
*/
|
|
4
|
+
export type SqlStatement = {
|
|
5
|
+
text: string;
|
|
6
|
+
values: unknown[];
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Tagged-template helper for building parameterized SQL statements.
|
|
10
|
+
* @param strings Template string parts.
|
|
11
|
+
* @param values Interpolated values or nested `SqlStatement` values.
|
|
12
|
+
* @returns A normalized SQL statement.
|
|
13
|
+
*/
|
|
14
|
+
export declare function sql(strings: TemplateStringsArray, ...values: unknown[]): SqlStatement;
|
|
15
|
+
/**
|
|
16
|
+
* Returns `true` when a value matches the `SqlStatement` shape.
|
|
17
|
+
* @param value Value to inspect.
|
|
18
|
+
* @returns Whether the value is a SQL statement object.
|
|
19
|
+
*/
|
|
20
|
+
export declare function isSqlStatement(value: unknown): value is SqlStatement;
|
|
21
|
+
/**
|
|
22
|
+
* Creates a SQL statement from raw text and values.
|
|
23
|
+
* @param text SQL text containing `?` placeholders.
|
|
24
|
+
* @param values Placeholder values.
|
|
25
|
+
* @returns A normalized SQL statement.
|
|
26
|
+
*/
|
|
27
|
+
export declare function rawSql(text: string, values?: unknown[]): SqlStatement;
|
|
28
|
+
//# sourceMappingURL=sql.d.ts.map
|