UNPKG

4nm

Version:

TypeScript reimplementation of Telegram's official library for communicating with Telegram Web Apps.

87 lines (86 loc) 2.78 kB
/** * 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; };