4nm
Version:
TypeScript reimplementation of Telegram's official library for communicating with Telegram Web Apps.
87 lines (86 loc) • 2.78 kB
JavaScript
/**
* Creates new parser for specified schema.
* TODO: Add getDefault function.
* @param schema - schema description.
*/
export function createSearchParamsSchemaParser(schema) {
return value => {
// Convert passed value to URLSearchParams.
const query = typeof value === 'string' ? new URLSearchParams(value) : value;
const result = {};
for (const prop in schema) {
const [name, parser] = schema[prop];
try {
const value = parser(query.get(name));
if (value !== undefined) {
result[prop] = value;
}
}
catch (e) {
throw new Error(`Unable to parse param "${name}"`, { cause: e });
}
}
return result;
};
}
/**
* Parses URLSearchParams parameter as string.
* @param value - raw value.
* @throws {TypeError} Value has incorrect type.
*/
export const parseSearchParamAsString = value => {
if (value === null) {
throw new TypeError(`Unable to parse value "${value}" as string.`);
}
return value;
};
/**
* Parses URLSearchParams parameter as optional string.
* @param value - raw value.
*/
export const parseSearchParamAsOptString = value => value === null ? undefined : value;
/**
* Parses URLSearchParams parameter as int.
* @param value - raw value.
* @throws {TypeError} Value has incorrect type.
*/
export const parseSearchParamAsInt = value => {
if (value === null || value === '') {
throw new TypeError(`Unable to parse value "${value}" as string.`);
}
const num = parseInt(value);
if (Number.isNaN(num)) {
throw new TypeError(`Unable to parse value "${value}" as int.`);
}
return num;
};
/**
* Parses URLSearchParams parameter as Date.
* @param value - raw value.
* @throws {TypeError} Value has incorrect type.
*/
export const parseSearchParamAsDate = value => {
if (value === '' || value === null) {
throw new TypeError(`Unable to parse value "${value}" as Date`);
}
const date = new Date(parseInt(value) * 1000);
if (date.toString() === 'Invalid Date') {
throw new TypeError(`Unable to parse value "${value}" as Date`);
}
return date;
};
/**
* Parses URLSearchParams parameter as optional Date.
* @param value - raw value.
* @throws {TypeError} Value has incorrect type.
*/
export const parseSearchParamAsOptDate = value => {
if (value === null) {
return;
}
const date = new Date(parseInt(value) * 1000);
if (date.toString() === 'Invalid Date') {
throw new TypeError(`Unable to value "${value}" as Date`);
}
return date;
};