{"version":3,"file":"js-php-data.cjs","sources":["../src/convert.js","../src/helpers.js","../src/index.js"],"sourcesContent":["import { isPlainObject, escapeRegex } from './helpers.js'\n\nexport default function internalConvert(\n  value,\n  options = {},\n  { refs = [], trail = [] } = {}\n) {\n  const {\n    castToObject = false,\n    quotes = 'single',\n    removeUndefinedProperties = true,\n    onCircular = 'nullWithComment'\n  } = options\n\n  function stringify(value, delimiter = quotes === 'single' ? \"'\" : '\"') {\n    if (value.includes('\\n')) {\n      delimiter = '\"'\n    }\n\n    let sanitizedValue = value\n      .replace(/\\\\/g, '\\\\\\\\')\n      .replace(new RegExp(escapeRegex(delimiter), 'g'), `\\\\${delimiter}`)\n\n    if (delimiter === '\"') {\n      sanitizedValue = sanitizedValue\n        .replace(/\\$/g, '\\\\$')\n        .replace(/\\n/g, '\\\\n')\n    }\n\n    return delimiter + sanitizedValue + delimiter\n  }\n\n  function circular() {\n    switch (onCircular) {\n      case 'null':\n        return 'null'\n      case 'nullWithComment':\n        return 'null /* CIRCULAR */'\n      case 'string':\n        return stringify('::CIRCULAR::')\n      case 'throw':\n        handleError(new Error(`err:circular:${JSON.stringify(trail)}`))\n    }\n  }\n\n  function handleError(error) {\n    let errorTrail\n    if (error.message.startsWith('err:type:')) {\n      errorTrail = JSON.parse(error.message.slice(9)).slice(0, -1)\n      if (errorTrail.length > 0) {\n        throw new Error(`Disallowed value type in ${printTrail(errorTrail)}`)\n      } else {\n        throw new Error(`Disallowed input type`)\n      }\n    } else if (error.message.startsWith('err:plain:')) {\n      errorTrail = JSON.parse(error.message.slice(10)).slice(0, -1)\n      if (errorTrail.length > 0) {\n        throw new Error(\n          `Disallowed non-plain object in ${printTrail(errorTrail)}`\n        )\n      } else {\n        throw new Error(`Disallowed non-plain object input`)\n      }\n    } else if (error.message.startsWith('err:circular:')) {\n      errorTrail = JSON.parse(error.message.slice(13))\n      throw new Error(`Circular reference: ${printTrail(errorTrail)}`)\n    } else if (error.message.startsWith('err:NaN:')) {\n      errorTrail = JSON.parse(error.message.slice(8))\n      if (errorTrail.length > 0) {\n        throw new Error(`Invalid NaN: ${printTrail(errorTrail)}`)\n      } else {\n        throw new Error('Invalid NaN input')\n      }\n    } else {\n      throw error\n    }\n  }\n\n  function printTrail(trail) {\n    return (\n      'INPUT' +\n      trail\n        .map((item, index) => {\n          if (typeof item === 'number') return `[${item}]`\n          if (item.match(/^[a-z0-9_$]+$/i)) return `.${item}`\n          return `[${stringify(item, '\"')}]`\n        })\n        .join('')\n    )\n  }\n\n  function printObject(value) {\n    let result = ''\n\n    if (castToObject) result += '(object) '\n\n    result += '['\n\n    let items = Object.entries(value)\n    refs = refs.concat(value)\n\n    if (removeUndefinedProperties) {\n      items = items.filter(([key, value]) => typeof value !== 'undefined')\n    }\n\n    if (items.length > 0) result += '\\n'\n\n    for (const [key, value] of items) {\n      let convertedValue\n      try {\n        convertedValue = internalConvert(\n          value,\n          { ...options },\n          {\n            refs,\n            trail: trail.concat(key)\n          }\n        )\n      } catch (err) {\n        handleError(err)\n      }\n\n      result += `${stringify(key)} => ${convertedValue},\\n`\n    }\n    result += ']'\n\n    return result\n  }\n\n  function printArray(value) {\n    let result = ''\n\n    result += '['\n    if (value.length > 0) result += '\\n'\n\n    refs = refs.concat([value])\n\n    for (let i = 0; i < value.length; i++) {\n      let convertedValue\n      try {\n        convertedValue = internalConvert(\n          value[i],\n          { ...options },\n          {\n            refs,\n            trail: trail.concat(i)\n          }\n        )\n\n        result += `${convertedValue},\\n`\n      } catch (err) {\n        handleError(err)\n      }\n    }\n\n    result += ']'\n    return result\n  }\n\n  let result = ''\n  if (Array.isArray(value)) {\n    if (refs.includes(value)) {\n      try {\n        result += circular()\n      } catch (err) {\n        return handleError(err)\n      }\n    } else {\n      result += printArray(value, options)\n    }\n  } else if (value == null) {\n    result += 'null'\n  } else if (typeof value === 'object') {\n    if (isPlainObject(value)) {\n      if (refs.includes(value)) {\n        try {\n          result += circular()\n        } catch (err) {\n          handleError(err)\n        }\n      } else {\n        result += printObject(value, options)\n      }\n    } else {\n      handleError(new Error(`err:plain:${JSON.stringify(trail)}`))\n    }\n  } else if (typeof value === 'number') {\n    if (isNaN(value)) {\n      result += 'NAN'\n    } else {\n      if (value === Infinity) {\n        result += 'INF'\n      } else if (value === -Infinity) {\n        result += '-INF'\n      } else {\n        result += String(value)\n      }\n    }\n  } else if (typeof value === 'boolean') {\n    result += String(value)\n  } else if (typeof value === 'string') {\n    result += stringify(value)\n  } else {\n    handleError(new Error(`err:type:${JSON.stringify(trail)}`))\n  }\n\n  return result\n}\n","/* OBJECTS */\n\n/**\n * Checks if value is a plain object\n * @param  {Any}  obj\n * @return {Boolean}\n */\nexport function isPlainObject(value) {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    value.prototype == null &&\n    value.constructor === Object\n  )\n}\n\n/* STRINGS */\n\n/**\n * Escapes regular expression special characters\n * @param  {String} str\n * @return {String}\n */\nexport function escapeRegex(str) {\n  return str.replace(/[-[\\]/{}()*+?.\\\\^$|]/g, '\\\\$&')\n}\n","import prettier from 'prettier'\nimport phpPlugin from '@prettier/plugin-php/standalone.js'\nimport internalConvert from './convert.js'\n\n/**\n * Convert a JavaScript value to PHP code.\n *\n * @param {any} value\n * @param {{\n *   castToObject?: boolean\n *   bracketArrays?: boolean\n *   indentation?: number | 'tab'\n *   trailingCommas?: boolean\n *   quotes?: 'single' | 'double'\n *   removeUndefinedProperties?: boolean\n *   onCircular?: 'null' | 'nullWithComment' | 'string' | 'throw'\n * }|undefined} options\n * @returns {string}\n */\nexport default function convert(\n  value,\n  {\n    castToObject = false,\n    bracketArrays = true,\n    indentation = 4,\n    trailingCommas = false,\n    quotes = 'single',\n    removeUndefinedProperties = true,\n    onCircular = 'nullWithComment'\n  } = {}\n) {\n  if (\n    indentation !== 'tab' &&\n    !(Number.isInteger(indentation) && indentation >= 0)\n  ) {\n    throw new Error('`indentation` must be non-negative integer or \"tab\"')\n  }\n  if (!['single', 'double'].includes(quotes)) {\n    throw new Error('`quotes` must be either \"single\" or \"double\"')\n  }\n\n  const unconvertableOptions = ['null', 'nullWithComment', 'string', 'throw']\n  if (!unconvertableOptions.includes(onCircular)) {\n    throw new Error(\n      '`onCircular` must be either \"null\", \"nullWithComment\", \"string\" or \"throw\"'\n    )\n  }\n\n  const rawResult = internalConvert(value, {\n    castToObject,\n    quotes,\n    removeUndefinedProperties,\n    onCircular\n  })\n\n  const formattedResult = prettier.format(`<?php return ${rawResult};`, {\n    parser: 'php',\n    plugins: [phpPlugin],\n    phpVersion: bracketArrays ? '7.4' : '5.3',\n    trailingCommaPHP: trailingCommas,\n    tabWidth: Number.isInteger(indentation) ? indentation : undefined,\n    useTabs: indentation === 'tab',\n    singleQuote: quotes === 'single'\n  })\n\n  return formattedResult.replace(/^.*?\\sreturn(.+);\\s*$/s, '$1').trim()\n}\n"],"names":["internalConvert","value","options","_temp","_ref","_ref$refs","refs","_ref$trail","trail","_options$castToObject","castToObject","_options$quotes","quotes","_options$removeUndefi","removeUndefinedProperties","_options$onCircular","onCircular","stringify","delimiter","includes","sanitizedValue","replace","RegExp","circular","handleError","Error","JSON","error","errorTrail","message","startsWith","parse","slice","length","printTrail","map","item","index","match","join","result","Array","isArray","err","concat","i","_extends","printArray","prototype","constructor","Object","isPlainObject","items","entries","filter","_ref2","_iterator","_step","_createForOfIteratorHelperLoose","done","_step$value","key","convertedValue","printObject","isNaN","Infinity","String","_ref$castToObject","_ref$bracketArrays","bracketArrays","_ref$indentation","indentation","_ref$trailingCommas","trailingCommas","_ref$quotes","_ref$removeUndefinedP","_ref$onCircular","Number","isInteger","rawResult","prettier","format","parser","plugins","phpPlugin","phpVersion","trailingCommaPHP","tabWidth","undefined","useTabs","singleQuote","trim"],"mappings":"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"}