UNPKG

7.16 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../../lib/is-serializable-props.ts"],"names":["regexpPlainIdentifier","isPlainObject","value","Object","prototype","toString","call","getPrototypeOf","isSerializableProps","page","method","input","SerializableError","visit","visited","path","has","get","set","isSerializable","refs","type","entries","every","key","nestedValue","nextPath","test","JSON","stringify","newRefs","Map","Array","isArray","index","Error","constructor","message"],"mappings":"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","sourcesContent":["const regexpPlainIdentifier = /^[A-Za-z_$][A-Za-z0-9_$]*$/\n\nfunction isPlainObject(value: any): boolean {\n if (Object.prototype.toString.call(value) !== '[object Object]') {\n return false\n }\n\n const prototype = Object.getPrototypeOf(value)\n return prototype === null || prototype === Object.prototype\n}\n\nexport function isSerializableProps(\n page: string,\n method: string,\n input: any\n): true {\n if (!isPlainObject(input)) {\n throw new SerializableError(\n page,\n method,\n '',\n `Props must be returned as a plain object from ${method}: \\`{ props: { ... } }\\`.`\n )\n }\n\n function visit(visited: Map<any, string>, value: any, path: string) {\n if (visited.has(value)) {\n throw new SerializableError(\n page,\n method,\n path,\n `Circular references cannot be expressed in JSON (references: \\`${\n visited.get(value) || '(self)'\n }\\`).`\n )\n }\n\n visited.set(value, path)\n }\n\n function isSerializable(\n refs: Map<any, string>,\n value: any,\n path: string\n ): true {\n const type = typeof value\n if (\n // `null` can be serialized, but not `undefined`.\n value === null ||\n // n.b. `bigint`, `function`, `symbol`, and `undefined` cannot be\n // serialized.\n //\n // `object` is special-cased below, as it may represent `null`, an Array,\n // a plain object, a class, et al.\n type === 'boolean' ||\n type === 'number' ||\n type === 'string'\n ) {\n return true\n }\n\n if (type === 'undefined') {\n throw new SerializableError(\n page,\n method,\n path,\n '`undefined` cannot be serialized as JSON. Please use `null` or omit this value.'\n )\n }\n\n if (isPlainObject(value)) {\n visit(refs, value, path)\n\n if (\n Object.entries(value).every(([key, nestedValue]) => {\n const nextPath = regexpPlainIdentifier.test(key)\n ? `${path}.${key}`\n : `${path}[${JSON.stringify(key)}]`\n\n const newRefs = new Map(refs)\n return (\n isSerializable(newRefs, key, nextPath) &&\n isSerializable(newRefs, nestedValue, nextPath)\n )\n })\n ) {\n return true\n }\n\n throw new SerializableError(\n page,\n method,\n path,\n `invariant: Unknown error encountered in Object.`\n )\n }\n\n if (Array.isArray(value)) {\n visit(refs, value, path)\n\n if (\n value.every((nestedValue, index) => {\n const newRefs = new Map(refs)\n return isSerializable(newRefs, nestedValue, `${path}[${index}]`)\n })\n ) {\n return true\n }\n\n throw new SerializableError(\n page,\n method,\n path,\n `invariant: Unknown error encountered in Array.`\n )\n }\n\n // None of these can be expressed as JSON:\n // const type: \"bigint\" | \"symbol\" | \"object\" | \"function\"\n throw new SerializableError(\n page,\n method,\n path,\n '`' +\n type +\n '`' +\n (type === 'object'\n ? ` (\"${Object.prototype.toString.call(value)}\")`\n : '') +\n ' cannot be serialized as JSON. Please only return JSON serializable data types.'\n )\n }\n\n return isSerializable(new Map(), input, '')\n}\n\nexport class SerializableError extends Error {\n constructor(page: string, method: string, path: string, message: string) {\n super(\n path\n ? `Error serializing \\`${path}\\` returned from \\`${method}\\` in \"${page}\".\\nReason: ${message}`\n : `Error serializing props returned from \\`${method}\\` in \"${page}\".\\nReason: ${message}`\n )\n }\n}\n"]}
\No newline at end of file