Skip to main content
Glama
serializer.js3.96 kB
'use strict' // eslint-disable-next-line const STR_ESCAPE = /[\u0000-\u001f\u0022\u005c\ud800-\udfff]/ module.exports = class Serializer { constructor (options) { switch (options && options.rounding) { case 'floor': this.parseInteger = Math.floor break case 'ceil': this.parseInteger = Math.ceil break case 'round': this.parseInteger = Math.round break case 'trunc': default: this.parseInteger = Math.trunc break } this._options = options } asInteger (i) { if (Number.isInteger(i)) { return '' + i } else if (typeof i === 'bigint') { return i.toString() } /* eslint no-undef: "off" */ const integer = this.parseInteger(i) // check if number is Infinity or NaN // eslint-disable-next-line no-self-compare if (integer === Infinity || integer === -Infinity || integer !== integer) { throw new Error(`The value "${i}" cannot be converted to an integer.`) } return '' + integer } asNumber (i) { // fast cast to number const num = Number(i) // check if number is NaN // eslint-disable-next-line no-self-compare if (num !== num) { throw new Error(`The value "${i}" cannot be converted to a number.`) } else if (num === Infinity || num === -Infinity) { return 'null' } else { return '' + num } } asBoolean (bool) { return bool && 'true' || 'false' // eslint-disable-line } asDateTime (date) { if (date === null) return '""' if (date instanceof Date) { return '"' + date.toISOString() + '"' } if (typeof date === 'string') { return '"' + date + '"' } throw new Error(`The value "${date}" cannot be converted to a date-time.`) } asDate (date) { if (date === null) return '""' if (date instanceof Date) { return '"' + new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString().slice(0, 10) + '"' } if (typeof date === 'string') { return '"' + date + '"' } throw new Error(`The value "${date}" cannot be converted to a date.`) } asTime (date) { if (date === null) return '""' if (date instanceof Date) { return '"' + new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toISOString().slice(11, 19) + '"' } if (typeof date === 'string') { return '"' + date + '"' } throw new Error(`The value "${date}" cannot be converted to a time.`) } asString (str) { const len = str.length if (len === 0) { return '""' } else if (len < 42) { // magically escape strings for json // relying on their charCodeAt // everything below 32 needs JSON.stringify() // every string that contain surrogate needs JSON.stringify() // 34 and 92 happens all the time, so we // have a fast case for them let result = '' let last = -1 let point = 255 for (let i = 0; i < len; i++) { point = str.charCodeAt(i) if ( point === 0x22 || // '"' point === 0x5c // '\' ) { last === -1 && (last = 0) result += str.slice(last, i) + '\\' last = i } else if (point < 32 || (point >= 0xD800 && point <= 0xDFFF)) { // The current character is non-printable characters or a surrogate. return JSON.stringify(str) } } return (last === -1 && ('"' + str + '"')) || ('"' + result + str.slice(last) + '"') } else if (len < 5000 && STR_ESCAPE.test(str) === false) { // Only use the regular expression for shorter input. The overhead is otherwise too much. return '"' + str + '"' } else { return JSON.stringify(str) } } asUnsafeString (str) { return '"' + str + '"' } getState () { return this._options } static restoreFromState (state) { return new Serializer(state) } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/krtw00/search-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server