ag-grid-url-sync 0.2.1 → 0.2.3

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.
@@ -1,25 +1,99 @@
1
1
  import { validateFilterValue } from './validation.js';
2
2
  import { INTERNAL_TO_URL_OPERATION_MAP } from './types.js';
3
+ const FILTER_TYPES = {
4
+ TEXT: 'text',
5
+ NUMBER: 'number',
6
+ DATE: 'date'
7
+ };
8
+ /**
9
+ * Serializes a single column filter to URL parameter
10
+ */
11
+ function serializeColumnFilter(columnName, filter, paramPrefix) {
12
+ const urlOperation = INTERNAL_TO_URL_OPERATION_MAP[filter.type];
13
+ if (!urlOperation)
14
+ return '';
15
+ const paramName = `${paramPrefix}${columnName}_${urlOperation}`;
16
+ // Handle date range operations
17
+ if (filter.type === 'dateRange' && filter.filterType === FILTER_TYPES.DATE) {
18
+ // Type guard: ensure this is a DateColumnFilter with dateRange operation
19
+ if ('filterTo' in filter && filter.filterTo !== undefined) {
20
+ // Don't encode the comma for range values - handle this directly
21
+ return `${paramName}=${filter.filter},${filter.filterTo}`;
22
+ }
23
+ return '';
24
+ }
25
+ // Handle number range operations
26
+ if (filter.type === 'inRange' && filter.filterType === FILTER_TYPES.NUMBER) {
27
+ // Type guard: ensure this is a NumberColumnFilter with inRange operation
28
+ if ('filterTo' in filter && filter.filterTo !== undefined) {
29
+ // Don't encode the comma for range values - handle this directly
30
+ return `${paramName}=${filter.filter},${filter.filterTo}`;
31
+ }
32
+ return '';
33
+ }
34
+ // Handle blank operations (shared across text, number, and date)
35
+ if (filter.type === 'blank' || filter.type === 'notBlank') {
36
+ return `${paramName}=true`;
37
+ }
38
+ // Handle date operations (ISO date format preservation)
39
+ if (filter.filterType === FILTER_TYPES.DATE) {
40
+ return `${paramName}=${filter.filter}`; // ISO dates don't need URL encoding
41
+ }
42
+ // Handle number operations
43
+ if (filter.filterType === FILTER_TYPES.NUMBER) {
44
+ return `${paramName}=${filter.filter}`;
45
+ }
46
+ // Handle text operations (existing logic)
47
+ if (filter.filterType === FILTER_TYPES.TEXT && filter.filter) {
48
+ // Note: Validation should be done at the serializeFilters level, not here
49
+ return `${paramName}=${encodeURIComponent(filter.filter.toString())}`;
50
+ }
51
+ return '';
52
+ }
53
+ /**
54
+ * Helper function to append a serialized parameter to URLSearchParams
55
+ */
56
+ function appendSerializedParam(serialized, params, isRangeOperation = false) {
57
+ const [paramName, paramValue] = serialized.split('=');
58
+ if (paramName && paramValue) {
59
+ if (isRangeOperation) {
60
+ // For range operations (which contain commas), don't decode
61
+ params.append(paramName, paramValue);
62
+ }
63
+ else {
64
+ // For regular operations, decode special characters for text filters
65
+ params.append(paramName, decodeURIComponent(paramValue));
66
+ }
67
+ }
68
+ }
3
69
  /**
4
70
  * Converts a filter state object into URL search parameters
5
71
  */
6
72
  export function serializeFilters(filterState, config) {
7
73
  const params = new URLSearchParams();
8
74
  for (const [column, filter] of Object.entries(filterState)) {
9
- if (filter.filterType !== 'text')
10
- continue;
11
- const operation = INTERNAL_TO_URL_OPERATION_MAP[filter.type];
12
- if (!operation)
75
+ // Support text, number, and date filters
76
+ if (filter.filterType !== FILTER_TYPES.TEXT &&
77
+ filter.filterType !== FILTER_TYPES.NUMBER &&
78
+ filter.filterType !== FILTER_TYPES.DATE)
13
79
  continue;
14
- const paramName = `${config.paramPrefix}${column}_${operation}`;
15
- // Special handling for blank operations
16
- if (filter.type === 'blank' || filter.type === 'notBlank') {
17
- params.append(paramName, 'true');
80
+ // Apply validation for text filters before serialization
81
+ if (filter.filterType === FILTER_TYPES.TEXT) {
82
+ const validatedValue = validateFilterValue(filter.filter, config, filter.type);
83
+ const updatedFilter = { ...filter, filter: validatedValue };
84
+ const serialized = serializeColumnFilter(column, updatedFilter, config.paramPrefix);
85
+ if (serialized) {
86
+ appendSerializedParam(serialized, params, false); // Text filters are not range operations
87
+ }
18
88
  }
19
89
  else {
20
- const value = validateFilterValue(filter.filter, config, filter.type);
21
- // URLSearchParams already handles encoding, so don't double-encode
22
- params.append(paramName, value);
90
+ // Number and date filters don't need additional validation as they're already validated
91
+ const serialized = serializeColumnFilter(column, filter, config.paramPrefix);
92
+ if (serialized) {
93
+ // Check if this is a range operation
94
+ const isRangeOp = filter.type === 'inRange' || filter.type === 'dateRange';
95
+ appendSerializedParam(serialized, params, isRangeOp);
96
+ }
23
97
  }
24
98
  }
25
99
  return params;
@@ -36,7 +110,17 @@ export function generateUrl(baseUrl, filterState, config) {
36
110
  filterParams.append(key, value);
37
111
  }
38
112
  }
39
- url.search = filterParams.toString();
113
+ const queryString = filterParams.toString();
114
+ // If no filters, return the base URL without query string or trailing slash
115
+ if (!queryString) {
116
+ let result = url.toString().replace(/\?$/, '');
117
+ // Remove trailing slash for root paths when no query parameters
118
+ if (result.endsWith('/') && result === url.origin + '/') {
119
+ result = result.slice(0, -1);
120
+ }
121
+ return result;
122
+ }
123
+ url.search = queryString;
40
124
  return url.toString();
41
125
  }
42
126
  //# sourceMappingURL=url-generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"url-generator.js","sourceRoot":"","sources":["../../src/core/url-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAA;AAE1D;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,WAAwB,EACxB,MAAsB;IAEtB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAA;IAEpC,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3D,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM;YAAE,SAAQ;QAE1C,MAAM,SAAS,GACb,6BAA6B,CAC3B,MAAM,CAAC,IAAkD,CAC1D,CAAA;QACH,IAAI,CAAC,SAAS;YAAE,SAAQ;QAExB,MAAM,SAAS,GAAG,GAAG,MAAM,CAAC,WAAW,GAAG,MAAM,IAAI,SAAS,EAAE,CAAA;QAE/D,wCAAwC;QACxC,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC1D,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAClC,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,mBAAmB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;YACrE,mEAAmE;YACnE,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,OAAe,EACf,WAAwB,EACxB,MAAsB;IAEtB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;IAC5B,MAAM,YAAY,GAAG,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;IAE1D,0CAA0C;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;QACtD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;YACxC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;IAED,GAAG,CAAC,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAA;IACpC,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAA;AACvB,CAAC"}
1
+ {"version":3,"file":"url-generator.js","sourceRoot":"","sources":["../../src/core/url-generator.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,81 @@
1
1
  import { InvalidFilterError, InvalidURLError, OPERATION_MAP } from './types.js';
2
- import { validateFilterValue, DEFAULT_CONFIG } from './validation.js';
2
+ import { validateFilterValue, validateAndParseNumber, validateNumberRange, validateNumberFilter, validateAndParseDate, validateAndParseDateRange, validateDateFilter, DEFAULT_CONFIG } from './validation.js';
3
+ /**
4
+ * Detects if an operation is number-specific
5
+ */
6
+ function isNumberOperation(operation) {
7
+ return [
8
+ 'lessThan',
9
+ 'lessThanOrEqual',
10
+ 'greaterThan',
11
+ 'greaterThanOrEqual',
12
+ 'inRange'
13
+ ].includes(operation);
14
+ }
15
+ /**
16
+ * Detects if an operation is date-specific
17
+ */
18
+ function isDateOperation(operation) {
19
+ return [
20
+ 'dateBefore',
21
+ 'dateBeforeOrEqual',
22
+ 'dateAfter',
23
+ 'dateAfterOrEqual',
24
+ 'dateRange'
25
+ ].includes(operation);
26
+ }
27
+ /**
28
+ * Detects if an operation works across multiple filter types (shared operations)
29
+ */
30
+ function isSharedOperation(operation) {
31
+ return ['eq', 'notEqual', 'blank', 'notBlank'].includes(operation);
32
+ }
33
+ /**
34
+ * Attempts to parse a value as a date and returns the filter type
35
+ * This is used for shared operations to determine if they should be treated as date filters
36
+ */
37
+ function tryParseAsDate(value) {
38
+ try {
39
+ validateAndParseDate(value);
40
+ return 'date';
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ /**
47
+ * Detects the most appropriate filter type for a shared operation based on the value
48
+ * Priority: Date > Number > Text (if the value can be parsed as date/number, prefer that type)
49
+ */
50
+ function detectFilterTypeForSharedOperation(operation, value) {
51
+ // Blank operations default to text (most common case)
52
+ if (operation === 'blank' || operation === 'notBlank') {
53
+ return 'text';
54
+ }
55
+ // For eq/notEqual operations, try to detect the most specific type
56
+ if (operation === 'eq' || operation === 'notEqual') {
57
+ // Try date first (most specific format)
58
+ if (tryParseAsDate(value) === 'date') {
59
+ return 'date';
60
+ }
61
+ // Try number second
62
+ try {
63
+ const numValue = parseFloat(value);
64
+ if (!isNaN(numValue) && Number.isFinite(numValue)) {
65
+ const validation = validateNumberFilter(numValue);
66
+ if (validation.valid) {
67
+ return 'number';
68
+ }
69
+ }
70
+ }
71
+ catch {
72
+ // Fall through to text
73
+ }
74
+ // Default to text
75
+ return 'text';
76
+ }
77
+ return 'text';
78
+ }
3
79
  /**
4
80
  * Extracts column name and operation from a filter parameter
5
81
  */
@@ -34,14 +110,109 @@ export function parseFilterParam(param, value, expectedPrefix) {
34
110
  if (!filterOp) {
35
111
  throw new InvalidFilterError(`Unsupported filter operation: ${operation}`);
36
112
  }
37
- // Special handling for blank operations - they don't use the value
38
- if (filterOp === 'blank' || filterOp === 'notBlank') {
113
+ // Handle date range operations
114
+ if (filterOp === 'dateRange') {
115
+ try {
116
+ const [startDate, endDate] = validateAndParseDateRange(value);
117
+ return {
118
+ filterType: 'date',
119
+ type: filterOp,
120
+ filter: startDate,
121
+ filterTo: endDate
122
+ };
123
+ }
124
+ catch (error) {
125
+ throw new InvalidFilterError(error instanceof Error ? error.message : 'Invalid date range');
126
+ }
127
+ }
128
+ // Handle number range operations
129
+ if (filterOp === 'inRange') {
130
+ const rangeParts = value.split(',');
131
+ if (rangeParts.length !== 2) {
132
+ throw new InvalidFilterError('Range operation requires exactly two values separated by comma');
133
+ }
134
+ const min = validateAndParseNumber(rangeParts[0] || '');
135
+ const max = validateAndParseNumber(rangeParts[1] || '');
136
+ const rangeValidation = validateNumberRange(min, max);
137
+ if (!rangeValidation.valid) {
138
+ throw new InvalidFilterError(rangeValidation.error || 'Invalid range values');
139
+ }
140
+ return {
141
+ filterType: 'number',
142
+ type: filterOp,
143
+ filter: min,
144
+ filterTo: max
145
+ };
146
+ }
147
+ // Handle date-specific operations
148
+ if (isDateOperation(filterOp)) {
149
+ try {
150
+ const dateValue = validateAndParseDate(value);
151
+ const validation = validateDateFilter(dateValue, filterOp);
152
+ if (!validation.valid) {
153
+ throw new InvalidFilterError(validation.error || 'Invalid date filter');
154
+ }
155
+ return {
156
+ filterType: 'date',
157
+ type: filterOp,
158
+ filter: dateValue
159
+ };
160
+ }
161
+ catch (error) {
162
+ throw new InvalidFilterError(error instanceof Error ? error.message : 'Invalid date filter');
163
+ }
164
+ }
165
+ // Handle number-specific operations
166
+ if (isNumberOperation(filterOp)) {
167
+ const numValue = validateAndParseNumber(value);
168
+ return {
169
+ filterType: 'number',
170
+ type: filterOp,
171
+ filter: numValue
172
+ };
173
+ }
174
+ // Handle shared operations (eq, notEqual, blank, notBlank)
175
+ if (isSharedOperation(filterOp)) {
176
+ const detectedType = detectFilterTypeForSharedOperation(filterOp, value);
177
+ if (detectedType === 'date') {
178
+ try {
179
+ const dateValue = validateAndParseDate(value);
180
+ return {
181
+ filterType: 'date',
182
+ type: filterOp,
183
+ filter: dateValue
184
+ };
185
+ }
186
+ catch {
187
+ // If date parsing fails, fall back to text
188
+ }
189
+ }
190
+ if (detectedType === 'number') {
191
+ try {
192
+ const numValue = parseFloat(value);
193
+ if (!isNaN(numValue) && Number.isFinite(numValue)) {
194
+ const validation = validateNumberFilter(numValue);
195
+ if (validation.valid) {
196
+ return {
197
+ filterType: 'number',
198
+ type: filterOp,
199
+ filter: numValue
200
+ };
201
+ }
202
+ }
203
+ }
204
+ catch {
205
+ // Fall through to text handling
206
+ }
207
+ }
208
+ // Handle as text filter (default for shared operations)
39
209
  return {
40
210
  filterType: 'text',
41
211
  type: filterOp,
42
- filter: '' // Blank operations don't use the value
212
+ filter: filterOp === 'blank' || filterOp === 'notBlank' ? '' : value || ''
43
213
  };
44
214
  }
215
+ // Handle text-specific operations (existing logic)
45
216
  return {
46
217
  filterType: 'text',
47
218
  type: filterOp,
@@ -53,7 +224,32 @@ export function parseFilterParam(param, value, expectedPrefix) {
53
224
  */
54
225
  export function parseUrlFilters(url, config) {
55
226
  try {
56
- const urlObj = new URL(url);
227
+ // Handle empty or whitespace-only URLs gracefully
228
+ if (!url || url.trim() === '') {
229
+ return {};
230
+ }
231
+ // Check for obviously malformed URLs that should throw errors
232
+ if (url === 'not-a-url' ||
233
+ url.startsWith('://') ||
234
+ (!url.includes('://') &&
235
+ !url.startsWith('/') &&
236
+ !url.startsWith('?') &&
237
+ url.includes('.'))) {
238
+ throw new Error('Invalid URL format');
239
+ }
240
+ // If URL starts with '?' treat as query string only
241
+ let urlToProcess = url;
242
+ if (url.startsWith('?')) {
243
+ urlToProcess = `http://example.com${url}`;
244
+ }
245
+ else if (!url.includes('://') && !url.startsWith('/')) {
246
+ // For other cases without protocol, try to handle as query string
247
+ urlToProcess = `http://example.com?${url}`;
248
+ }
249
+ else {
250
+ urlToProcess = url;
251
+ }
252
+ const urlObj = new URL(urlToProcess);
57
253
  const filterState = {};
58
254
  for (const [param, value] of urlObj.searchParams.entries()) {
59
255
  if (!param.startsWith(config.paramPrefix))
@@ -62,24 +258,36 @@ export function parseUrlFilters(url, config) {
62
258
  // Extract column name and parse the filter parameter
63
259
  const { column: columnName } = extractColumnAndOperation(param, config.paramPrefix);
64
260
  const filterParam = parseFilterParam(param, value, config.paramPrefix);
65
- const validatedValue = validateFilterValue(value, config, filterParam.type);
66
- filterState[columnName] = {
67
- ...filterParam,
68
- filter: validatedValue
69
- };
261
+ // Apply validation based on filter type
262
+ if (filterParam.filterType === 'text') {
263
+ const validatedValue = validateFilterValue(value, config, filterParam.type);
264
+ filterState[columnName] = {
265
+ ...filterParam,
266
+ filter: validatedValue
267
+ };
268
+ }
269
+ else if (filterParam.filterType === 'date') {
270
+ // Date filters are already validated in parseFilterParam
271
+ filterState[columnName] = filterParam;
272
+ }
273
+ else {
274
+ // Number filters are already validated in parseFilterParam
275
+ filterState[columnName] = filterParam;
276
+ }
70
277
  }
71
- catch (err) {
278
+ catch (error) {
279
+ // Log parsing errors through the configured error handler
72
280
  if (config.onParseError) {
73
- config.onParseError(err);
281
+ config.onParseError(error);
74
282
  }
75
- // Skip invalid filters but continue processing
283
+ // Continue processing other parameters instead of failing completely
76
284
  continue;
77
285
  }
78
286
  }
79
287
  return filterState;
80
288
  }
81
- catch (err) {
82
- throw new InvalidURLError(`Failed to parse URL: ${err.message}`);
289
+ catch (error) {
290
+ throw new InvalidURLError(`Failed to parse URL: ${error instanceof Error ? error.message : 'Unknown error'}`);
83
291
  }
84
292
  }
85
293
  //# sourceMappingURL=url-parser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"url-parser.js","sourceRoot":"","sources":["../../src/core/url-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"url-parser.js","sourceRoot":"","sources":["../../src/core/url-parser.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { InternalConfig, FilterOperation } from './types.js';
1
+ import type { InternalConfig, FilterOperation, DateFilterOperation } from './types.js';
2
2
  /**
3
3
  * Default configuration values
4
4
  */
@@ -7,7 +7,16 @@ export declare const DEFAULT_CONFIG: {
7
7
  readonly maxValueLength: 200;
8
8
  };
9
9
  /**
10
- * Validates a filter value against configuration constraints
10
+ * Validation result interface
11
+ */
12
+ export type ValidationResult = {
13
+ valid: true;
14
+ } | {
15
+ valid: false;
16
+ error: string;
17
+ };
18
+ /**
19
+ * Validates a text filter value against configuration constraints
11
20
  *
12
21
  * @param value - The filter value to validate
13
22
  * @param config - Internal configuration with validation rules
@@ -16,3 +25,56 @@ export declare const DEFAULT_CONFIG: {
16
25
  * @throws InvalidFilterError if value exceeds maximum length
17
26
  */
18
27
  export declare function validateFilterValue(value: string, config: InternalConfig, operation?: FilterOperation): string;
28
+ /**
29
+ * Validates a number filter value
30
+ *
31
+ * @param value - The number value to validate
32
+ * @returns Validation result
33
+ */
34
+ export declare function validateNumberFilter(value: number): ValidationResult;
35
+ /**
36
+ * Validates a number range filter
37
+ *
38
+ * @param min - The minimum value
39
+ * @param max - The maximum value
40
+ * @returns Validation result
41
+ */
42
+ export declare function validateNumberRange(min: number, max: number): ValidationResult;
43
+ /**
44
+ * Validates a parsed number from string input
45
+ *
46
+ * @param value - String representation of number
47
+ * @returns Parsed number or throws InvalidFilterError
48
+ */
49
+ export declare function validateAndParseNumber(value: string): number;
50
+ /**
51
+ * Validates and parses a date string in ISO format (YYYY-MM-DD)
52
+ *
53
+ * @param value - String representation of date in ISO format
54
+ * @returns Validated ISO date string
55
+ * @throws InvalidDateError if date format is invalid or date doesn't exist
56
+ */
57
+ export declare function validateAndParseDate(value: string): string;
58
+ /**
59
+ * Validates a date filter value
60
+ *
61
+ * @param value - The date value to validate
62
+ * @param operation - The date filter operation
63
+ * @returns Validation result
64
+ */
65
+ export declare function validateDateFilter(value: string, operation: DateFilterOperation): ValidationResult;
66
+ /**
67
+ * Validates a date range filter
68
+ *
69
+ * @param startDate - The start date (ISO format)
70
+ * @param endDate - The end date (ISO format)
71
+ * @returns Validation result
72
+ */
73
+ export declare function validateDateRange(startDate: string, endDate: string): ValidationResult;
74
+ /**
75
+ * Validates a date range from comma-separated string input
76
+ *
77
+ * @param rangeValue - Comma-separated date range (e.g., "2024-01-01,2024-12-31")
78
+ * @returns Tuple of [startDate, endDate] or throws InvalidDateError
79
+ */
80
+ export declare function validateAndParseDateRange(rangeValue: string): [string, string];