ag-grid-url-sync 0.5.0 → 0.5.1
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/README.md +110 -55
- package/dist/core/ag-grid-url-sync.d.ts +10 -9
- package/dist/core/ag-grid-url-sync.js +23 -19
- package/dist/core/ag-grid-url-sync.js.map +1 -1
- package/dist/core/grid-integration.d.ts +27 -1
- package/dist/core/grid-integration.js +161 -129
- package/dist/core/grid-integration.js.map +1 -1
- package/dist/core/index.d.ts +2 -1
- package/dist/core/index.js +2 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/individual-params.d.ts +12 -5
- package/dist/core/individual-params.js +38 -62
- package/dist/core/individual-params.js.map +1 -1
- package/dist/core/issue-columns.d.ts +2 -0
- package/dist/core/issue-columns.js +11 -0
- package/dist/core/issue-columns.js.map +1 -0
- package/dist/core/issues.d.ts +34 -0
- package/dist/core/issues.js +58 -0
- package/dist/core/issues.js.map +1 -0
- package/dist/core/operators.d.ts +189 -0
- package/dist/core/operators.js +60 -0
- package/dist/core/operators.js.map +1 -0
- package/dist/core/options.d.ts +21 -0
- package/dist/core/options.js +21 -0
- package/dist/core/options.js.map +1 -0
- package/dist/core/schemas.d.ts +51 -0
- package/dist/core/schemas.js +59 -0
- package/dist/core/schemas.js.map +1 -0
- package/dist/core/serialization/formats.d.ts +7 -7
- package/dist/core/serialization/formats.js +34 -28
- package/dist/core/serialization/formats.js.map +1 -1
- package/dist/core/serialization/grouped.d.ts +9 -12
- package/dist/core/serialization/grouped.js +24 -17
- package/dist/core/serialization/grouped.js.map +1 -1
- package/dist/core/to-error.d.ts +5 -0
- package/dist/core/to-error.js +4 -0
- package/dist/core/to-error.js.map +1 -0
- package/dist/core/types.d.ts +149 -43
- package/dist/core/types.js +35 -108
- package/dist/core/types.js.map +1 -1
- package/dist/core/url-generator.d.ts +4 -4
- package/dist/core/url-generator.js +9 -7
- package/dist/core/url-generator.js.map +1 -1
- package/dist/core/url-parser.d.ts +4 -4
- package/dist/core/url-parser.js +6 -4
- package/dist/core/url-parser.js.map +1 -1
- package/dist/core/validation.d.ts +21 -14
- package/dist/core/validation.js +58 -54
- package/dist/core/validation.js.map +1 -1
- package/dist/core/view-storage.js +21 -19
- package/dist/core/view-storage.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/react/types.d.ts +31 -12
- package/dist/react/use-ag-grid-url-sync.js +148 -87
- package/dist/react/use-ag-grid-url-sync.js.map +1 -1
- package/package.json +22 -15
|
@@ -1,12 +1,19 @@
|
|
|
1
|
-
import { InvalidFilterError
|
|
2
|
-
import {
|
|
1
|
+
import { InvalidFilterError } from './types.js';
|
|
2
|
+
import { operatorById, operatorFromUrl, isOperationOnlyFor, isSharedOperation } from './operators.js';
|
|
3
|
+
import { validateFilterValue, validateAndParseNumber, parseExactNumber, validateNumberRange, validateAndParseDate, validateAndParseDateRange, validateDateFilter } from './validation.js';
|
|
4
|
+
import { DEFAULT_CONFIG, resolveOptions } from './options.js';
|
|
5
|
+
import { reportIssue, toIssue } from './issues.js';
|
|
3
6
|
const FILTER_TYPES = {
|
|
4
7
|
TEXT: 'text',
|
|
5
8
|
NUMBER: 'number',
|
|
6
9
|
DATE: 'date'
|
|
7
10
|
};
|
|
11
|
+
export function resolveParamPrefix(paramPrefix) {
|
|
12
|
+
const prefix = paramPrefix || DEFAULT_CONFIG.paramPrefix;
|
|
13
|
+
return prefix.endsWith('_') ? prefix : `${prefix}_`;
|
|
14
|
+
}
|
|
8
15
|
function serializeColumnFilter(columnName, filter, paramPrefix) {
|
|
9
|
-
const urlOperation =
|
|
16
|
+
const urlOperation = operatorById(filter.type)?.url;
|
|
10
17
|
if (!urlOperation)
|
|
11
18
|
return null;
|
|
12
19
|
const paramName = `${paramPrefix}${columnName}_${urlOperation}`;
|
|
@@ -28,7 +35,8 @@ function serializeColumnFilter(columnName, filter, paramPrefix) {
|
|
|
28
35
|
}
|
|
29
36
|
return null;
|
|
30
37
|
}
|
|
31
|
-
export function serializeFilters(filterState, config) {
|
|
38
|
+
export function serializeFilters(filterState, config = {}) {
|
|
39
|
+
const options = resolveOptions(config);
|
|
32
40
|
const params = new URLSearchParams();
|
|
33
41
|
for (const [column, filter] of Object.entries(filterState)) {
|
|
34
42
|
if (filter.filterType !== FILTER_TYPES.TEXT &&
|
|
@@ -40,42 +48,21 @@ export function serializeFilters(filterState, config) {
|
|
|
40
48
|
try {
|
|
41
49
|
checkedFilter = {
|
|
42
50
|
...filter,
|
|
43
|
-
filter: validateFilterValue(filter.filter,
|
|
51
|
+
filter: validateFilterValue(filter.filter, options, filter.type)
|
|
44
52
|
};
|
|
45
53
|
}
|
|
46
54
|
catch (error) {
|
|
47
|
-
|
|
55
|
+
reportIssue(options, toIssue(error, 'INVALID_PARAM', column));
|
|
48
56
|
continue;
|
|
49
57
|
}
|
|
50
58
|
}
|
|
51
|
-
const param = serializeColumnFilter(column, checkedFilter,
|
|
59
|
+
const param = serializeColumnFilter(column, checkedFilter, resolveParamPrefix(options.paramPrefix));
|
|
52
60
|
if (param) {
|
|
53
61
|
params.append(...param);
|
|
54
62
|
}
|
|
55
63
|
}
|
|
56
64
|
return params;
|
|
57
65
|
}
|
|
58
|
-
function isNumberOperation(operation) {
|
|
59
|
-
return [
|
|
60
|
-
'lessThan',
|
|
61
|
-
'lessThanOrEqual',
|
|
62
|
-
'greaterThan',
|
|
63
|
-
'greaterThanOrEqual',
|
|
64
|
-
'inRange'
|
|
65
|
-
].includes(operation);
|
|
66
|
-
}
|
|
67
|
-
function isDateOperation(operation) {
|
|
68
|
-
return [
|
|
69
|
-
'dateBefore',
|
|
70
|
-
'dateBeforeOrEqual',
|
|
71
|
-
'dateAfter',
|
|
72
|
-
'dateAfterOrEqual',
|
|
73
|
-
'dateRange'
|
|
74
|
-
].includes(operation);
|
|
75
|
-
}
|
|
76
|
-
function isSharedOperation(operation) {
|
|
77
|
-
return ['eq', 'notEqual', 'blank', 'notBlank'].includes(operation);
|
|
78
|
-
}
|
|
79
66
|
function tryParseAsDate(value) {
|
|
80
67
|
try {
|
|
81
68
|
validateAndParseDate(value);
|
|
@@ -85,14 +72,6 @@ function tryParseAsDate(value) {
|
|
|
85
72
|
return null;
|
|
86
73
|
}
|
|
87
74
|
}
|
|
88
|
-
function tryParseNumber(value) {
|
|
89
|
-
try {
|
|
90
|
-
return validateAndParseNumber(value);
|
|
91
|
-
}
|
|
92
|
-
catch {
|
|
93
|
-
return null;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
75
|
function detectFilterTypeForSharedOperation(operation, value) {
|
|
97
76
|
if (operation === 'blank' || operation === 'notBlank') {
|
|
98
77
|
return 'text';
|
|
@@ -101,7 +80,7 @@ function detectFilterTypeForSharedOperation(operation, value) {
|
|
|
101
80
|
if (tryParseAsDate(value) === 'date') {
|
|
102
81
|
return 'date';
|
|
103
82
|
}
|
|
104
|
-
if (
|
|
83
|
+
if (parseExactNumber(value) !== null) {
|
|
105
84
|
return 'number';
|
|
106
85
|
}
|
|
107
86
|
return 'text';
|
|
@@ -109,15 +88,11 @@ function detectFilterTypeForSharedOperation(operation, value) {
|
|
|
109
88
|
return 'text';
|
|
110
89
|
}
|
|
111
90
|
function extractColumnAndOperation(param, expectedPrefix) {
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
? ensureTrailingUnderscore(expectedPrefix)
|
|
115
|
-
: ensureTrailingUnderscore(DEFAULT_CONFIG.paramPrefix);
|
|
116
|
-
const prefixToCheck = sanitizedPrefix.slice(0, -1);
|
|
117
|
-
if (!param.startsWith(prefixToCheck + '_')) {
|
|
91
|
+
const prefix = resolveParamPrefix(expectedPrefix);
|
|
92
|
+
if (!param.startsWith(prefix)) {
|
|
118
93
|
throw new InvalidFilterError(`Invalid filter prefix in parameter: ${param}`);
|
|
119
94
|
}
|
|
120
|
-
const withoutPrefix = param.substring(
|
|
95
|
+
const withoutPrefix = param.substring(prefix.length);
|
|
121
96
|
const lastUnderscoreIndex = withoutPrefix.lastIndexOf('_');
|
|
122
97
|
if (lastUnderscoreIndex === -1) {
|
|
123
98
|
throw new InvalidFilterError(`Invalid filter parameter format: ${param}`);
|
|
@@ -134,7 +109,7 @@ export function parseFilterParam(param, value, expectedPrefix) {
|
|
|
134
109
|
return parseFilterOperation(operation, value);
|
|
135
110
|
}
|
|
136
111
|
function parseFilterOperation(operation, value) {
|
|
137
|
-
const filterOp =
|
|
112
|
+
const filterOp = operatorFromUrl(operation)?.id;
|
|
138
113
|
if (!filterOp) {
|
|
139
114
|
throw new InvalidFilterError(`Unsupported filter operation: ${operation}`);
|
|
140
115
|
}
|
|
@@ -149,19 +124,19 @@ function parseFilterOperation(operation, value) {
|
|
|
149
124
|
};
|
|
150
125
|
}
|
|
151
126
|
catch (error) {
|
|
152
|
-
throw new InvalidFilterError(error instanceof Error ? error.message : 'Invalid date range');
|
|
127
|
+
throw new InvalidFilterError(error instanceof Error ? error.message : 'Invalid date range', undefined, { code: 'INVALID_DATE' });
|
|
153
128
|
}
|
|
154
129
|
}
|
|
155
130
|
if (filterOp === 'inRange') {
|
|
156
131
|
const rangeParts = value.split(',');
|
|
157
132
|
if (rangeParts.length !== 2) {
|
|
158
|
-
throw new InvalidFilterError('Range operation requires exactly two values separated by comma');
|
|
133
|
+
throw new InvalidFilterError('Range operation requires exactly two values separated by comma', undefined, { code: 'INVALID_NUMBER' });
|
|
159
134
|
}
|
|
160
135
|
const min = validateAndParseNumber(rangeParts[0] || '');
|
|
161
136
|
const max = validateAndParseNumber(rangeParts[1] || '');
|
|
162
137
|
const rangeValidation = validateNumberRange(min, max);
|
|
163
138
|
if (!rangeValidation.valid) {
|
|
164
|
-
throw new InvalidFilterError(rangeValidation.error || 'Invalid range values');
|
|
139
|
+
throw new InvalidFilterError(rangeValidation.error || 'Invalid range values', undefined, { code: 'INVALID_NUMBER' });
|
|
165
140
|
}
|
|
166
141
|
return {
|
|
167
142
|
filterType: 'number',
|
|
@@ -170,7 +145,7 @@ function parseFilterOperation(operation, value) {
|
|
|
170
145
|
filterTo: max
|
|
171
146
|
};
|
|
172
147
|
}
|
|
173
|
-
if (
|
|
148
|
+
if (isOperationOnlyFor(filterOp, 'date')) {
|
|
174
149
|
try {
|
|
175
150
|
const dateValue = validateAndParseDate(value);
|
|
176
151
|
const validation = validateDateFilter(dateValue, filterOp);
|
|
@@ -184,10 +159,10 @@ function parseFilterOperation(operation, value) {
|
|
|
184
159
|
};
|
|
185
160
|
}
|
|
186
161
|
catch (error) {
|
|
187
|
-
throw new InvalidFilterError(error instanceof Error ? error.message : 'Invalid date filter');
|
|
162
|
+
throw new InvalidFilterError(error instanceof Error ? error.message : 'Invalid date filter', undefined, { code: 'INVALID_DATE' });
|
|
188
163
|
}
|
|
189
164
|
}
|
|
190
|
-
if (
|
|
165
|
+
if (isOperationOnlyFor(filterOp, 'number')) {
|
|
191
166
|
const numValue = validateAndParseNumber(value);
|
|
192
167
|
return {
|
|
193
168
|
filterType: 'number',
|
|
@@ -210,7 +185,7 @@ function parseFilterOperation(operation, value) {
|
|
|
210
185
|
}
|
|
211
186
|
}
|
|
212
187
|
if (detectedType === 'number') {
|
|
213
|
-
const numValue =
|
|
188
|
+
const numValue = parseExactNumber(value);
|
|
214
189
|
if (numValue !== null) {
|
|
215
190
|
return {
|
|
216
191
|
filterType: 'number',
|
|
@@ -232,29 +207,30 @@ function parseFilterOperation(operation, value) {
|
|
|
232
207
|
};
|
|
233
208
|
}
|
|
234
209
|
export function parseIndividualParams(searchParams, config) {
|
|
235
|
-
const
|
|
210
|
+
const filters = new Map();
|
|
211
|
+
const prefix = resolveParamPrefix(config.paramPrefix);
|
|
236
212
|
for (const [param, value] of searchParams.entries()) {
|
|
237
|
-
if (!param.startsWith(
|
|
213
|
+
if (!param.startsWith(prefix))
|
|
238
214
|
continue;
|
|
215
|
+
let columnName;
|
|
239
216
|
try {
|
|
240
|
-
const
|
|
217
|
+
const parts = extractColumnAndOperation(param, prefix);
|
|
218
|
+
columnName = parts.column;
|
|
219
|
+
const { operation } = parts;
|
|
241
220
|
const filterParam = parseFilterOperation(operation, value);
|
|
242
221
|
if (filterParam.filterType === 'text') {
|
|
243
222
|
const validatedValue = validateFilterValue(value, config, filterParam.type);
|
|
244
|
-
|
|
245
|
-
...filterParam,
|
|
246
|
-
filter: validatedValue
|
|
247
|
-
};
|
|
223
|
+
filters.set(parts.column, { ...filterParam, filter: validatedValue });
|
|
248
224
|
}
|
|
249
225
|
else {
|
|
250
|
-
|
|
226
|
+
filters.set(parts.column, filterParam);
|
|
251
227
|
}
|
|
252
228
|
}
|
|
253
229
|
catch (error) {
|
|
254
|
-
config
|
|
230
|
+
reportIssue(config, toIssue(error, 'INVALID_PARAM', columnName));
|
|
255
231
|
continue;
|
|
256
232
|
}
|
|
257
233
|
}
|
|
258
|
-
return
|
|
234
|
+
return Object.fromEntries(filters);
|
|
259
235
|
}
|
|
260
236
|
//# sourceMappingURL=individual-params.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"individual-params.js","sourceRoot":"","sources":["../../src/core/individual-params.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"individual-params.js","sourceRoot":"","sources":["../../src/core/individual-params.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function attachColumn(error, column) {
|
|
2
|
+
if (Object.getOwnPropertyDescriptor(error, 'column') !== undefined)
|
|
3
|
+
return;
|
|
4
|
+
Object.defineProperty(error, 'column', {
|
|
5
|
+
value: column,
|
|
6
|
+
enumerable: true,
|
|
7
|
+
writable: false,
|
|
8
|
+
configurable: true
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=issue-columns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-columns.js","sourceRoot":"","sources":["../../src/core/issue-columns.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,YAAY,CAAC,KAAY,EAAE,MAAc;IACvD,IAAI,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,SAAS;QAAE,OAAM;IAE1E,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE;QACrC,KAAK,EAAE,MAAM;QACb,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,KAAK;QAEf,YAAY,EAAE,IAAI;KACnB,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { IssueCode, ResolvedOptions } from './types.js';
|
|
2
|
+
import { URLSyncError } from './types.js';
|
|
3
|
+
/** The codes for a filter that is dropped or not valid */
|
|
4
|
+
export declare const DATA_ISSUE_CODES: ReadonlySet<IssueCode>;
|
|
5
|
+
/** Whether the error is a data issue: a filter that is dropped or not valid */
|
|
6
|
+
export declare function isDataIssue(error: unknown): error is URLSyncError;
|
|
7
|
+
/**
|
|
8
|
+
* The caught value as an issue. A URLSyncError keeps its class and code, and
|
|
9
|
+
* gets the column if it has none. Any other value becomes a URLSyncError with
|
|
10
|
+
* the code, and the original error is its cause.
|
|
11
|
+
*/
|
|
12
|
+
export declare function toIssue(cause: unknown, code: IssueCode, column?: string): URLSyncError;
|
|
13
|
+
/** Options for one call, and the issues that the call reports */
|
|
14
|
+
export interface IssueCollector {
|
|
15
|
+
options: ResolvedOptions;
|
|
16
|
+
issues: URLSyncError[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Options that also keep each issue they report, so a method can return the
|
|
20
|
+
* issues of one call (#229). The caller's onParseError still gets each one.
|
|
21
|
+
*/
|
|
22
|
+
export declare function collectIssues(options: ResolvedOptions): IssueCollector;
|
|
23
|
+
/** Whether throwOnError picks the issue (#229) */
|
|
24
|
+
export declare function shouldThrow(throwOnError: ResolvedOptions['throwOnError'], issue: URLSyncError): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Reports one issue to the caller. An issue that throwOnError picks is thrown
|
|
27
|
+
* instead, and it does not reach onParseError (#229).
|
|
28
|
+
*/
|
|
29
|
+
export declare function reportIssue(options: ResolvedOptions, issue: URLSyncError): void;
|
|
30
|
+
/**
|
|
31
|
+
* Rethrows an issue that reportIssue threw. A catch that wraps errors calls
|
|
32
|
+
* this first, so a thrown issue reaches the caller one time, not wrapped again.
|
|
33
|
+
*/
|
|
34
|
+
export declare function rethrowIfThrown(cause: unknown): void;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { URLSyncError } from './types.js';
|
|
2
|
+
import { attachColumn } from './issue-columns.js';
|
|
3
|
+
import { toError } from './to-error.js';
|
|
4
|
+
export const DATA_ISSUE_CODES = new Set([
|
|
5
|
+
'INVALID_PARAM',
|
|
6
|
+
'INVALID_NUMBER',
|
|
7
|
+
'INVALID_DATE',
|
|
8
|
+
'VALUE_TOO_LONG',
|
|
9
|
+
'INVALID_GROUPED',
|
|
10
|
+
'TYPE_MISMATCH',
|
|
11
|
+
'INVALID_URL'
|
|
12
|
+
]);
|
|
13
|
+
export function isDataIssue(error) {
|
|
14
|
+
return error instanceof URLSyncError && DATA_ISSUE_CODES.has(error.code);
|
|
15
|
+
}
|
|
16
|
+
export function toIssue(cause, code, column) {
|
|
17
|
+
if (cause instanceof URLSyncError) {
|
|
18
|
+
if (column !== undefined)
|
|
19
|
+
attachColumn(cause, column);
|
|
20
|
+
return cause;
|
|
21
|
+
}
|
|
22
|
+
const error = toError(cause);
|
|
23
|
+
return new URLSyncError(error.message, error, { code, column });
|
|
24
|
+
}
|
|
25
|
+
export function collectIssues(options) {
|
|
26
|
+
const issues = [];
|
|
27
|
+
return {
|
|
28
|
+
issues,
|
|
29
|
+
options: {
|
|
30
|
+
...options,
|
|
31
|
+
onParseError: error => {
|
|
32
|
+
if (error instanceof URLSyncError)
|
|
33
|
+
issues.push(error);
|
|
34
|
+
options.onParseError(error);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const thrownIssues = new WeakSet();
|
|
40
|
+
export function shouldThrow(throwOnError, issue) {
|
|
41
|
+
if (throwOnError === undefined || throwOnError === false)
|
|
42
|
+
return false;
|
|
43
|
+
if (throwOnError === true)
|
|
44
|
+
return true;
|
|
45
|
+
return throwOnError(issue);
|
|
46
|
+
}
|
|
47
|
+
export function reportIssue(options, issue) {
|
|
48
|
+
if (shouldThrow(options.throwOnError, issue)) {
|
|
49
|
+
thrownIssues.add(issue);
|
|
50
|
+
throw issue;
|
|
51
|
+
}
|
|
52
|
+
options.onParseError(issue);
|
|
53
|
+
}
|
|
54
|
+
export function rethrowIfThrown(cause) {
|
|
55
|
+
if (cause instanceof Error && thrownIssues.has(cause))
|
|
56
|
+
throw cause;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=issues.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/core/issues.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAOvC,MAAM,CAAC,MAAM,gBAAgB,GAA2B,IAAI,GAAG,CAAY;IACzE,eAAe;IACf,gBAAgB;IAChB,cAAc;IACd,gBAAgB;IAChB,iBAAiB;IACjB,eAAe;IACf,aAAa;CACd,CAAC,CAAA;AAGF,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,OAAO,KAAK,YAAY,YAAY,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AAC1E,CAAC;AAOD,MAAM,UAAU,OAAO,CACrB,KAAc,EACd,IAAe,EACf,MAAe;IAEf,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;QAClC,IAAI,MAAM,KAAK,SAAS;YAAE,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAErD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;IAE5B,OAAO,IAAI,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;AACjE,CAAC;AAYD,MAAM,UAAU,aAAa,CAAC,OAAwB;IACpD,MAAM,MAAM,GAAmB,EAAE,CAAA;IAEjC,OAAO;QACL,MAAM;QACN,OAAO,EAAE;YACP,GAAG,OAAO;YACV,YAAY,EAAE,KAAK,CAAC,EAAE;gBAEpB,IAAI,KAAK,YAAY,YAAY;oBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBACrD,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;YAC7B,CAAC;SACF;KACF,CAAA;AACH,CAAC;AAGD,MAAM,YAAY,GAAG,IAAI,OAAO,EAAS,CAAA;AAGzC,MAAM,UAAU,WAAW,CACzB,YAA6C,EAC7C,KAAmB;IAEnB,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,KAAK;QAAE,OAAO,KAAK,CAAA;IAEtE,IAAI,YAAY,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAEtC,OAAO,YAAY,CAAC,KAAK,CAAC,CAAA;AAC5B,CAAC;AAMD,MAAM,UAAU,WAAW,CACzB,OAAwB,EACxB,KAAmB;IAEnB,IAAI,WAAW,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC;QAC7C,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAEvB,MAAM,KAAK,CAAA;IACb,CAAC;IAED,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;AAC7B,CAAC;AAMD,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,IAAI,KAAK,YAAY,KAAK,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,MAAM,KAAK,CAAA;AACpE,CAAC"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/** A filter type that the library supports */
|
|
2
|
+
export type OperatorFilterType = 'text' | 'number' | 'date';
|
|
3
|
+
declare const ALL_TYPES: readonly ['text', 'number', 'date'];
|
|
4
|
+
/**
|
|
5
|
+
* Row order matters: the public operation lists keep their old order, and
|
|
6
|
+
* the deprecated reverse AG Grid map keeps its old "last row wins" values.
|
|
7
|
+
* Keep text-only rows first, then shared rows, then number-only rows, then
|
|
8
|
+
* date-only rows.
|
|
9
|
+
*/
|
|
10
|
+
export declare const OPERATORS: readonly [{
|
|
11
|
+
readonly id: 'contains';
|
|
12
|
+
readonly url: 'contains';
|
|
13
|
+
readonly agGrid: 'contains';
|
|
14
|
+
readonly types: readonly ["text"];
|
|
15
|
+
readonly arity: 1;
|
|
16
|
+
}, {
|
|
17
|
+
readonly id: 'notContains';
|
|
18
|
+
readonly url: 'notContains';
|
|
19
|
+
readonly agGrid: 'notContains';
|
|
20
|
+
readonly types: readonly ["text"];
|
|
21
|
+
readonly arity: 1;
|
|
22
|
+
}, {
|
|
23
|
+
readonly id: 'startsWith';
|
|
24
|
+
readonly url: 'startsWith';
|
|
25
|
+
readonly agGrid: 'startsWith';
|
|
26
|
+
readonly types: readonly ["text"];
|
|
27
|
+
readonly arity: 1;
|
|
28
|
+
}, {
|
|
29
|
+
readonly id: 'endsWith';
|
|
30
|
+
readonly url: 'endsWith';
|
|
31
|
+
readonly agGrid: 'endsWith';
|
|
32
|
+
readonly types: readonly ["text"];
|
|
33
|
+
readonly arity: 1;
|
|
34
|
+
}, {
|
|
35
|
+
readonly id: 'eq';
|
|
36
|
+
readonly url: 'eq';
|
|
37
|
+
readonly agGrid: 'equals';
|
|
38
|
+
readonly types: readonly ["text", "number", "date"];
|
|
39
|
+
readonly arity: 1;
|
|
40
|
+
}, {
|
|
41
|
+
readonly id: 'notEqual';
|
|
42
|
+
readonly url: 'neq';
|
|
43
|
+
readonly agGrid: 'notEqual';
|
|
44
|
+
readonly types: readonly ["text", "number", "date"];
|
|
45
|
+
readonly arity: 1;
|
|
46
|
+
}, {
|
|
47
|
+
readonly id: 'blank';
|
|
48
|
+
readonly url: 'blank';
|
|
49
|
+
readonly agGrid: 'blank';
|
|
50
|
+
readonly types: readonly ["text", "number", "date"];
|
|
51
|
+
readonly arity: 0;
|
|
52
|
+
}, {
|
|
53
|
+
readonly id: 'notBlank';
|
|
54
|
+
readonly url: 'notBlank';
|
|
55
|
+
readonly agGrid: 'notBlank';
|
|
56
|
+
readonly types: readonly ["text", "number", "date"];
|
|
57
|
+
readonly arity: 0;
|
|
58
|
+
}, {
|
|
59
|
+
readonly id: 'lessThan';
|
|
60
|
+
readonly url: 'lt';
|
|
61
|
+
readonly agGrid: 'lessThan';
|
|
62
|
+
readonly types: readonly ["number"];
|
|
63
|
+
readonly arity: 1;
|
|
64
|
+
}, {
|
|
65
|
+
readonly id: 'lessThanOrEqual';
|
|
66
|
+
readonly url: 'lte';
|
|
67
|
+
readonly agGrid: 'lessThanOrEqual';
|
|
68
|
+
readonly types: readonly ["number"];
|
|
69
|
+
readonly arity: 1;
|
|
70
|
+
}, {
|
|
71
|
+
readonly id: 'greaterThan';
|
|
72
|
+
readonly url: 'gt';
|
|
73
|
+
readonly agGrid: 'greaterThan';
|
|
74
|
+
readonly types: readonly ["number"];
|
|
75
|
+
readonly arity: 1;
|
|
76
|
+
}, {
|
|
77
|
+
readonly id: 'greaterThanOrEqual';
|
|
78
|
+
readonly url: 'gte';
|
|
79
|
+
readonly agGrid: 'greaterThanOrEqual';
|
|
80
|
+
readonly types: readonly ["number"];
|
|
81
|
+
readonly arity: 1;
|
|
82
|
+
}, {
|
|
83
|
+
readonly id: 'inRange';
|
|
84
|
+
readonly url: 'range';
|
|
85
|
+
readonly agGrid: 'inRange';
|
|
86
|
+
readonly types: readonly ["number"];
|
|
87
|
+
readonly arity: 2;
|
|
88
|
+
}, {
|
|
89
|
+
readonly id: 'dateBefore';
|
|
90
|
+
readonly url: 'before';
|
|
91
|
+
readonly agGrid: 'lessThan';
|
|
92
|
+
readonly types: readonly ["date"];
|
|
93
|
+
readonly arity: 1;
|
|
94
|
+
}, {
|
|
95
|
+
readonly id: 'dateBeforeOrEqual';
|
|
96
|
+
readonly url: 'beforeEq';
|
|
97
|
+
readonly agGrid: 'lessThanOrEqual';
|
|
98
|
+
readonly types: readonly ["date"];
|
|
99
|
+
readonly arity: 1;
|
|
100
|
+
}, {
|
|
101
|
+
readonly id: 'dateAfter';
|
|
102
|
+
readonly url: 'after';
|
|
103
|
+
readonly agGrid: 'greaterThan';
|
|
104
|
+
readonly types: readonly ["date"];
|
|
105
|
+
readonly arity: 1;
|
|
106
|
+
}, {
|
|
107
|
+
readonly id: 'dateAfterOrEqual';
|
|
108
|
+
readonly url: 'afterEq';
|
|
109
|
+
readonly agGrid: 'greaterThanOrEqual';
|
|
110
|
+
readonly types: readonly ["date"];
|
|
111
|
+
readonly arity: 1;
|
|
112
|
+
}, {
|
|
113
|
+
readonly id: 'dateRange';
|
|
114
|
+
readonly url: 'daterange';
|
|
115
|
+
readonly agGrid: 'inRange';
|
|
116
|
+
readonly types: readonly ["date"];
|
|
117
|
+
readonly arity: 2;
|
|
118
|
+
}];
|
|
119
|
+
export type Operator = (typeof OPERATORS)[number];
|
|
120
|
+
export type OperatorId = Operator['id'];
|
|
121
|
+
/**
|
|
122
|
+
* The ids of the rows in `Ops` that match `Match`, in table order, as a tuple
|
|
123
|
+
* with a literal type at each index
|
|
124
|
+
*/
|
|
125
|
+
type IdsWhere<Ops extends readonly unknown[], Match> = Ops extends readonly [
|
|
126
|
+
infer Head,
|
|
127
|
+
...infer Rest
|
|
128
|
+
] ? Head extends Match ? Head extends {
|
|
129
|
+
id: infer Id;
|
|
130
|
+
} ? [Id, ...IdsWhere<Rest, Match>] : IdsWhere<Rest, Match> : IdsWhere<Rest, Match> : [];
|
|
131
|
+
/**
|
|
132
|
+
* The tuples for each filter type, in a map. A generic `T` then indexes
|
|
133
|
+
* concrete tuples, so TypeScript can compare the generic type with a list of
|
|
134
|
+
* ids.
|
|
135
|
+
*/
|
|
136
|
+
type OnlyForTuples = {
|
|
137
|
+
[K in OperatorFilterType]: Readonly<IdsWhere<typeof OPERATORS, {
|
|
138
|
+
types: readonly [K];
|
|
139
|
+
}>>;
|
|
140
|
+
};
|
|
141
|
+
/** Ids of the operations that only one filter type supports, as a tuple */
|
|
142
|
+
export type OperationsOnlyForTuple<T extends OperatorFilterType> = OnlyForTuples[T];
|
|
143
|
+
/** Ids of the operations that every filter type supports, as a tuple */
|
|
144
|
+
export type SharedOperationsTuple = Readonly<IdsWhere<typeof OPERATORS, {
|
|
145
|
+
types: typeof ALL_TYPES;
|
|
146
|
+
}>>;
|
|
147
|
+
/**
|
|
148
|
+
* Ids of the operations that a filter type supports, as a tuple: its own
|
|
149
|
+
* operations first, then the shared ones
|
|
150
|
+
*/
|
|
151
|
+
export type OperationsForTuple<T extends OperatorFilterType> = {
|
|
152
|
+
[K in OperatorFilterType]: readonly [
|
|
153
|
+
...OnlyForTuples[K],
|
|
154
|
+
...SharedOperationsTuple
|
|
155
|
+
];
|
|
156
|
+
}[T];
|
|
157
|
+
/** Ids of the operations that a filter type supports, shared ones included */
|
|
158
|
+
export type OperationsFor<T extends OperatorFilterType> = OperationsForTuple<T>[number];
|
|
159
|
+
/** Ids of the operations that only one filter type supports */
|
|
160
|
+
export type OperationsOnlyFor<T extends OperatorFilterType> = OperationsOnlyForTuple<T>[number];
|
|
161
|
+
/** Ids of the operations that every filter type supports */
|
|
162
|
+
export type SharedOperationId = SharedOperationsTuple[number];
|
|
163
|
+
/** The operations that only `type` supports, in table order */
|
|
164
|
+
export declare function operationsOnlyFor<T extends OperatorFilterType>(type: T): OperationsOnlyForTuple<T>;
|
|
165
|
+
/** The operations that every filter type supports, in table order */
|
|
166
|
+
export declare function sharedOperations(): SharedOperationsTuple;
|
|
167
|
+
/**
|
|
168
|
+
* The operations that `type` supports: its own operations first, then the
|
|
169
|
+
* shared ones
|
|
170
|
+
*/
|
|
171
|
+
export declare function operationsFor<T extends OperatorFilterType>(type: T): OperationsForTuple<T>;
|
|
172
|
+
/** The operator with this internal id */
|
|
173
|
+
export declare function operatorById(id: string): Operator | undefined;
|
|
174
|
+
/** The operator with this name in a URL param (`gt`, `before`, `neq`, …) */
|
|
175
|
+
export declare function operatorFromUrl(urlName: string): Operator | undefined;
|
|
176
|
+
/**
|
|
177
|
+
* The operator for an AG Grid operation name on a filter type. The key is the
|
|
178
|
+
* pair, because AG Grid uses one name for a number and a date operation
|
|
179
|
+
* (`lessThan` is `lessThan` on a number filter and `dateBefore` on a date
|
|
180
|
+
* filter).
|
|
181
|
+
*/
|
|
182
|
+
export declare function operatorFromAgGrid(filterType: string | undefined, agGridName: string | undefined): Operator | undefined;
|
|
183
|
+
/** Whether `id` is an operation that only `type` supports */
|
|
184
|
+
export declare function isOperationOnlyFor<T extends OperatorFilterType>(id: string, type: T): id is OperationsOnlyFor<T>;
|
|
185
|
+
/** Whether `id` is an operation that every filter type supports */
|
|
186
|
+
export declare function isSharedOperation(id: string): id is SharedOperationId;
|
|
187
|
+
/** Whether `id` is an operation that `type` supports */
|
|
188
|
+
export declare function isOperationFor<T extends OperatorFilterType>(id: string, type: T): id is OperationsFor<T>;
|
|
189
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
const ALL_TYPES = ['text', 'number', 'date'];
|
|
2
|
+
export const OPERATORS = [
|
|
3
|
+
{ id: 'contains', url: 'contains', agGrid: 'contains', types: ['text'], arity: 1 },
|
|
4
|
+
{ id: 'notContains', url: 'notContains', agGrid: 'notContains', types: ['text'], arity: 1 },
|
|
5
|
+
{ id: 'startsWith', url: 'startsWith', agGrid: 'startsWith', types: ['text'], arity: 1 },
|
|
6
|
+
{ id: 'endsWith', url: 'endsWith', agGrid: 'endsWith', types: ['text'], arity: 1 },
|
|
7
|
+
{ id: 'eq', url: 'eq', agGrid: 'equals', types: ALL_TYPES, arity: 1 },
|
|
8
|
+
{ id: 'notEqual', url: 'neq', agGrid: 'notEqual', types: ALL_TYPES, arity: 1 },
|
|
9
|
+
{ id: 'blank', url: 'blank', agGrid: 'blank', types: ALL_TYPES, arity: 0 },
|
|
10
|
+
{ id: 'notBlank', url: 'notBlank', agGrid: 'notBlank', types: ALL_TYPES, arity: 0 },
|
|
11
|
+
{ id: 'lessThan', url: 'lt', agGrid: 'lessThan', types: ['number'], arity: 1 },
|
|
12
|
+
{ id: 'lessThanOrEqual', url: 'lte', agGrid: 'lessThanOrEqual', types: ['number'], arity: 1 },
|
|
13
|
+
{ id: 'greaterThan', url: 'gt', agGrid: 'greaterThan', types: ['number'], arity: 1 },
|
|
14
|
+
{ id: 'greaterThanOrEqual', url: 'gte', agGrid: 'greaterThanOrEqual', types: ['number'], arity: 1 },
|
|
15
|
+
{ id: 'inRange', url: 'range', agGrid: 'inRange', types: ['number'], arity: 2 },
|
|
16
|
+
{ id: 'dateBefore', url: 'before', agGrid: 'lessThan', types: ['date'], arity: 1 },
|
|
17
|
+
{ id: 'dateBeforeOrEqual', url: 'beforeEq', agGrid: 'lessThanOrEqual', types: ['date'], arity: 1 },
|
|
18
|
+
{ id: 'dateAfter', url: 'after', agGrid: 'greaterThan', types: ['date'], arity: 1 },
|
|
19
|
+
{ id: 'dateAfterOrEqual', url: 'afterEq', agGrid: 'greaterThanOrEqual', types: ['date'], arity: 1 },
|
|
20
|
+
{ id: 'dateRange', url: 'daterange', agGrid: 'inRange', types: ['date'], arity: 2 }
|
|
21
|
+
];
|
|
22
|
+
const isShared = (op) => op.types.length === ALL_TYPES.length;
|
|
23
|
+
const supports = (op, type) => op.types.some(own => own === type);
|
|
24
|
+
export function operationsOnlyFor(type) {
|
|
25
|
+
const ids = OPERATORS.flatMap(op => !isShared(op) && supports(op, type) ? [op.id] : []);
|
|
26
|
+
return ids;
|
|
27
|
+
}
|
|
28
|
+
export function sharedOperations() {
|
|
29
|
+
const ids = OPERATORS.flatMap(op => isShared(op) ? [op.id] : []);
|
|
30
|
+
return ids;
|
|
31
|
+
}
|
|
32
|
+
export function operationsFor(type) {
|
|
33
|
+
const own = operationsOnlyFor(type);
|
|
34
|
+
const ids = [...own, ...sharedOperations()];
|
|
35
|
+
return ids;
|
|
36
|
+
}
|
|
37
|
+
const BY_ID = new Map(OPERATORS.map(op => [op.id, op]));
|
|
38
|
+
const BY_URL = new Map(OPERATORS.map(op => [op.url, op]));
|
|
39
|
+
export function operatorById(id) {
|
|
40
|
+
return BY_ID.get(id);
|
|
41
|
+
}
|
|
42
|
+
export function operatorFromUrl(urlName) {
|
|
43
|
+
return BY_URL.get(urlName);
|
|
44
|
+
}
|
|
45
|
+
export function operatorFromAgGrid(filterType, agGridName) {
|
|
46
|
+
return OPERATORS.find(op => op.agGrid === agGridName && supports(op, filterType));
|
|
47
|
+
}
|
|
48
|
+
export function isOperationOnlyFor(id, type) {
|
|
49
|
+
const op = operatorById(id);
|
|
50
|
+
return op !== undefined && !isShared(op) && supports(op, type);
|
|
51
|
+
}
|
|
52
|
+
export function isSharedOperation(id) {
|
|
53
|
+
const op = operatorById(id);
|
|
54
|
+
return op !== undefined && isShared(op);
|
|
55
|
+
}
|
|
56
|
+
export function isOperationFor(id, type) {
|
|
57
|
+
const op = operatorById(id);
|
|
58
|
+
return op !== undefined && supports(op, type);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=operators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operators.js","sourceRoot":"","sources":["../../src/core/operators.ts"],"names":[],"mappings":"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"}
|