| import makeLegalIdentifier from './makeLegalIdentifier'; |
| import { DataToEsm } from './pluginutils'; |
| |
| export type Indent = string | null | undefined; |
| |
| function stringify(obj: any): string { |
| return (JSON.stringify(obj) || 'undefined').replace(/[\u2028\u2029]/g, char => `\\u${('000' + char.charCodeAt(0).toString(16)).slice(-4)}`); |
| } |
| |
| function serializeArray<T>(arr: Array<T>, indent: Indent, baseIndent: string): string { |
| let output = '['; |
| const separator = indent ? '\n' + baseIndent + indent : ''; |
| for (let i = 0; i < arr.length; i++) { |
| const key = arr[i]; |
| output += `${i > 0 ? ',' : ''}${separator}${serialize(key, indent, baseIndent + indent)}`; |
| } |
| return output + `${indent ? '\n' + baseIndent : ''}]`; |
| } |
| |
| function serializeObject<T>(obj: { [key: string]: T }, indent: Indent, baseIndent: string): string { |
| let output = '{'; |
| const separator = indent ? '\n' + baseIndent + indent : ''; |
| const keys = Object.keys(obj); |
| for (let i = 0; i < keys.length; i++) { |
| const key = keys[i]; |
| const stringKey = makeLegalIdentifier(key) === key ? key : stringify(key); |
| output += `${i > 0 ? ',' : ''}${separator}${stringKey}:${indent ? ' ' : ''}${serialize( |
| obj[key], |
| indent, |
| baseIndent + indent |
| )}`; |
| } |
| return output + `${indent ? '\n' + baseIndent : ''}}`; |
| } |
| |
| function serialize(obj: any, indent: Indent, baseIndent: string): string { |
| if (obj === Infinity) return 'Infinity'; |
| if (obj === -Infinity) return '-Infinity'; |
| if (obj === 0 && 1/obj === -Infinity) return '-0'; |
| if (obj instanceof Date) return 'new Date(' + obj.getTime() + ')'; |
| if (obj instanceof RegExp) return obj.toString(); |
| if (obj !== obj) return 'NaN'; |
| if (Array.isArray(obj)) return serializeArray(obj, indent, baseIndent); |
| if (obj === null) return 'null'; |
| if (typeof obj === 'object') return serializeObject(obj, indent, baseIndent); |
| return stringify(obj); |
| } |
| |
| const dataToEsm: DataToEsm = function dataToEsm(data, options = {}) { |
| const t = options.compact ? '' : 'indent' in options ? options.indent : '\t'; |
| const _ = options.compact ? '' : ' '; |
| const n = options.compact ? '' : '\n'; |
| const declarationType = options.preferConst ? 'const' : 'var'; |
| |
| if ( |
| options.namedExports === false || |
| typeof data !== 'object' || |
| Array.isArray(data) || |
| data instanceof Date || |
| data instanceof RegExp || |
| data === null |
| ) { |
| const code = serialize(data, options.compact ? null : t, ''); |
| const __ = _ || (/^[{[\-\/]/.test(code) ? '' : ' '); |
| return `export default${__}${code};`; |
| } |
| |
| let namedExportCode = ''; |
| const defaultExportRows = []; |
| const dataKeys = Object.keys(data); |
| for (let i = 0; i < dataKeys.length; i++) { |
| const key = dataKeys[i]; |
| if (key === makeLegalIdentifier(key)) { |
| if (options.objectShorthand) defaultExportRows.push(key); |
| else defaultExportRows.push(`${key}:${_}${key}`); |
| namedExportCode += `export ${declarationType} ${key}${_}=${_}${serialize( |
| data[key], |
| options.compact ? null : t, |
| '' |
| )};${n}`; |
| } else { |
| defaultExportRows.push( |
| `${stringify(key)}:${_}${serialize(data[key], options.compact ? null : t, '')}` |
| ); |
| } |
| } |
| return ( |
| namedExportCode + `export default${_}{${n}${t}${defaultExportRows.join(`,${n}${t}`)}${n}};${n}` |
| ); |
| }; |
| |
| export { dataToEsm as default }; |