diff options
Diffstat (limited to 'node_modules/rollup-pluginutils/src/dataToEsm.ts')
| -rw-r--r-- | node_modules/rollup-pluginutils/src/dataToEsm.ts | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/node_modules/rollup-pluginutils/src/dataToEsm.ts b/node_modules/rollup-pluginutils/src/dataToEsm.ts new file mode 100644 index 0000000..01cd4a3 --- /dev/null +++ b/node_modules/rollup-pluginutils/src/dataToEsm.ts @@ -0,0 +1,92 @@ +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 }; |
