|
@@ -5,6 +5,11 @@ import { |
|
|
QueryOrGrouping, |
|
|
QueryOrGrouping, |
|
|
} from '../../common'; |
|
|
} from '../../common'; |
|
|
|
|
|
|
|
|
|
|
|
import { |
|
|
|
|
|
DeserializeError, |
|
|
|
|
|
SerializeError, |
|
|
|
|
|
} from '../../errors'; |
|
|
|
|
|
|
|
|
interface ProcessEntryBase { |
|
|
interface ProcessEntryBase { |
|
|
type: string; |
|
|
type: string; |
|
|
} |
|
|
} |
|
@@ -34,10 +39,12 @@ interface ProcessEntryBoolean extends ProcessEntryBase { |
|
|
truthyStrings?: string[]; |
|
|
truthyStrings?: string[]; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
export type ProcessEntry = ProcessEntryString | ProcessEntryNumber | ProcessEntryBoolean; |
|
|
|
|
|
|
|
|
type ProcessEntry = ProcessEntryString | ProcessEntryNumber | ProcessEntryBoolean; |
|
|
|
|
|
|
|
|
export const name = 'application/x-www-form-urlencoded' as const; |
|
|
export const name = 'application/x-www-form-urlencoded' as const; |
|
|
|
|
|
|
|
|
|
|
|
class DeserializeInvalidFormatError extends DeserializeError {} |
|
|
|
|
|
|
|
|
const normalizeRhs = (lhs: string, rhs: string, processEntriesMap?: Record<string, ProcessEntry>) => { |
|
|
const normalizeRhs = (lhs: string, rhs: string, processEntriesMap?: Record<string, ProcessEntry>) => { |
|
|
const defaultCoerceValues = { |
|
|
const defaultCoerceValues = { |
|
|
type: 'string' |
|
|
type: 'string' |
|
@@ -107,7 +114,7 @@ const normalizeRhs = (lhs: string, rhs: string, processEntriesMap?: Record<strin |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
const unknownCoerceValues = coerceValues as unknown as Record<string, string>; |
|
|
const unknownCoerceValues = coerceValues as unknown as Record<string, string>; |
|
|
throw new Error(`Invalid coercion type: ${unknownCoerceValues.type}`); |
|
|
|
|
|
|
|
|
throw new DeserializeInvalidFormatError(`Invalid coercion type: ${unknownCoerceValues.type}`); |
|
|
// this will be sent to the data source, e.g., the SQL query |
|
|
// this will be sent to the data source, e.g., the SQL query |
|
|
// we can also make this function act as a "sanitizer" |
|
|
// we can also make this function act as a "sanitizer" |
|
|
} |
|
|
} |
|
@@ -186,6 +193,8 @@ export const deserialize: QueryMediaType< |
|
|
) |
|
|
) |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
class SerializeInvalidExpressionError extends SerializeError {} |
|
|
|
|
|
|
|
|
const serializeExpression = (ex2: QueryAnyExpression) => { |
|
|
const serializeExpression = (ex2: QueryAnyExpression) => { |
|
|
if ('name' in ex2) { |
|
|
if ('name' in ex2) { |
|
|
return [ex2.name, `(${ex2.args.map((s) => s.toString()).join(',')})`]; |
|
|
return [ex2.name, `(${ex2.args.map((s) => s.toString()).join(',')})`]; |
|
@@ -193,7 +202,7 @@ const serializeExpression = (ex2: QueryAnyExpression) => { |
|
|
|
|
|
|
|
|
if (ex2.rhs instanceof RegExp) { |
|
|
if (ex2.rhs instanceof RegExp) { |
|
|
if (ex2.operator !== 'REGEXP') { |
|
|
if (ex2.operator !== 'REGEXP') { |
|
|
throw new Error(`Invalid rhs given for operator: ${ex2.lhs} ${ex2.operator} <rhs>`); |
|
|
|
|
|
|
|
|
throw new SerializeInvalidExpressionError(`Invalid rhs given for operator: ${ex2.lhs} ${ex2.operator} <rhs>`); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return [ex2.lhs, ex2.rhs.toString()]; |
|
|
return [ex2.lhs, ex2.rhs.toString()]; |
|
@@ -210,7 +219,7 @@ const serializeExpression = (ex2: QueryAnyExpression) => { |
|
|
default: |
|
|
default: |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
throw new Error(`Invalid operator given for lhs: ${ex2.lhs} <op> ${ex2.rhs}`); |
|
|
|
|
|
|
|
|
throw new SerializeInvalidExpressionError(`Invalid operator given for lhs: ${ex2.lhs} <op> ${ex2.rhs}`); |
|
|
} |
|
|
} |
|
|
case 'number': { |
|
|
case 'number': { |
|
|
return [ex2.lhs, ex2.rhs.toString()]; |
|
|
return [ex2.lhs, ex2.rhs.toString()]; |
|
@@ -222,7 +231,7 @@ const serializeExpression = (ex2: QueryAnyExpression) => { |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
throw new Error(`Unknown type for rhs: ${ex2.lhs} ${ex2.operator} <rhs>`); |
|
|
|
|
|
|
|
|
throw new SerializeInvalidExpressionError(`Unknown type for rhs: ${ex2.lhs} ${ex2.operator} <rhs>`); |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
export const serialize: QueryMediaType< |
|
|
export const serialize: QueryMediaType< |
|
|