{"version":3,"file":"squirrelly.min.js","sources":["../src/helpers.js","../src/partials.js","../src/regexps.js","../src/nativeHelpers.js","../src/filters.js","../src/compile.js","../src/utils.js"],"sourcesContent":["var helpers = {\n// No helpers are included by default for the sake of size,\n// But there's an example of a helper below\n/*\n Date: function (args, content, blocks, options) {\n var today = new Date()\n var dd = today.getDate()\n var mm = today.getMonth() + 1 // January is 0!\n var yyyy = today.getFullYear()\n if (dd < 10) {\n dd = '0' + dd\n }\n if (mm < 10) {\n mm = '0' + mm\n }\n today = mm + '/' + dd + '/' + yyyy\n return today\n } */\n}\n\nexport default helpers\n","var Partials = {/*\n partialName: \"partialString\"\n*/}\n\nexport default Partials\n","export var initialRegEx = /{{ *?(?:(?:([\\w$]+) *?\\((.*?)\\) *?([\\w$]*))|(?:([\\w$]+) *?\\((.*?)\\) *?\\/)|(?:([\\w$@].*?) *?((?:\\| *?[\\w$]+ *)*))|(?:\\/ *?([\\w$]+))|(?:# *?([\\w$]+))|(?:!--[^]+?--)) *?}}\\n?/g\nexport var initialTags = {\n s: '{{',\n e: '}}'\n}\n\n// The regExp below matches all helper references inside helper parameters\nvar paramHelperRefRegExp = /@(?:((?:\\.\\.\\/)+)|([\\w$]+):)?/g\n\nexport var regEx = initialRegEx\nexport var tags = initialTags\n\nexport function setup () {\n // Resets the current tags to the default tags\n tags = initialTags\n regEx = initialRegEx\n regEx.lastIndex = 0\n}\n\nexport function defaultTags (tagArray) {\n // Redefine the default tags of the regexp\n changeTags(tagArray[0], tagArray[1])\n initialRegEx = regEx\n initialTags = tags\n}\n\nexport function changeTags (firstTag, secondTag) {\n // Update current tags\n var newRegEx =\n firstTag +\n regEx.source.slice(tags.s.length, 0 - (tags.e.length + 3)) +\n secondTag +\n '\\\\n?'\n var lastIndex = regEx.lastIndex\n tags = {\n s: firstTag,\n e: secondTag\n }\n regEx = RegExp(newRegEx, 'g')\n regEx.lastIndex = lastIndex\n}\n\nexport function replaceHelperRefs (str, helperArray, helperNumber) {\n return str.replace(paramHelperRefRegExp, function (m, scope, id) {\n var suffix\n if (scope && scope.length) {\n suffix = helperArray[helperNumber - scope.length / 3 - 1].id\n } else if (id) {\n suffix = id\n } else {\n suffix = ''\n }\n return 'hvals' + suffix + '.'\n })\n}\n\n// The whole regular expression can be hard to comprehend, so here it's broken down.\n// You can pass the string between \"START REGEXP\" and \"END REGEXP\" into a regular expression\n// That removes whitespace and comments, and outputs a working regular expression.\n\n/* START REGEXP\n{{ *? //the beginning\n(?: //or for each possible tag\n(?:([\\w$]+) *?\\((.*?)\\) *?([\\w$]*)) //if a helper oTag\n| //now for a self closing tag\n(?:([\\w$]+) *?\\((.*?)\\) *?\\/)\n| //now if a ref\n(?: //if a global or helper ref\n([\\w$@].*?) *? //ref content\n((?:\\| *?[\\w$]+ *)*) //filters\n) //end if a global or helper ref\n| //now if a helper cTag\n(?:\\/ *?([\\w$]+))\n| //now if a helper block\n(?:# *?([\\w$]+))\n| //now for comments\n(?:!--[^]+?--)\n) //end or for each possible tag\n *?}}\n\\n? //To replace a newline at the end of a line\n\nEND REGEXP */\n/*\np1: helper start name\np2: helper start params\np3: helper start id\np4: self-closing helper name\np5: self-closing helper params\np6: ref content\np7: ref filters\np8: helper close name\np9: helper block name\nHere's the RegExp I use to turn the expanded version between START REGEXP and END REGEXP to a working one: I replace [^\\S ]+| \\/\\/[\\w ']+\\n with \"\".\n*/\n","import { changeTags } from './regexps'\nvar nativeHelpers = {\n if: {\n helperStart: function (param) { // helperStart is called with (params, id) but id isn't needed\n return 'if(' + param + '){'\n },\n helperEnd: function () {\n return '}'\n },\n blocks: {\n else: function () { // called with (id) but neither param is needed\n return '}else{'\n }\n }\n },\n each: {\n helperStart: function (param, id) { // helperStart is called with (params, id) but id isn't needed\n return 'for(var i=0;i<' + param + \".length; i++){tR+=(function(hvals){var tR='';var hvals\" + id + '=hvals;'\n },\n helperEnd: function (param) {\n return 'return tR})({this:' + param + '[i],index:i})};'\n }\n },\n foreach: {\n helperStart: function (param, id) {\n return 'for(var key in ' + param + '){if(!' + param + \".hasOwnProperty(key)) continue;tR+=(function(hvals){var tR='';var hvals\" + id + '=hvals;'\n },\n helperEnd: function (param) {\n return 'return tR})({this:' + param + '[key], key: key})};'\n }\n },\n log: {\n selfClosing: function (param) {\n return 'console.log(' + param + ');'\n }\n },\n tags: {\n selfClosing: function (param) {\n var firstTag = param.slice(0, param.indexOf(',')).trim()\n var secondTag = param.slice(param.indexOf(',') + 1).trim()\n changeTags(firstTag, secondTag)\n return ''\n }\n },\n js: { // The js self-closing helper allows you to inject JavaScript straight into your template function\n selfClosing: function (param) {\n return param + ';'\n }\n }\n}\n\nexport default nativeHelpers\n","var escMap = {\n '&': '&',\n '<': '<',\n '\"': '"',\n \"'\": '''\n}\n\nfunction replaceChar (s) {\n return escMap[s]\n}\n\nvar escapeRegEx = /[&<\"']/g\nvar escapeRegExTest = /[&<\"']/\n\nexport var filters = {\n e: function (str) {\n // To deal with XSS. Based on Escape implementations of Mustache.JS and Marko, then customized.\n var newStr = String(str)\n if (escapeRegExTest.test(newStr)) {\n return newStr.replace(escapeRegEx, replaceChar)\n } else {\n return newStr\n }\n }\n}\n// Don't need a filter for unescape because that's just a flag telling Squirrelly not to escape\n\nexport var defaultFilters = {\n /*\n All strings are automatically passed through each of the default filters the user\n Has set to true. This opens up a realm of possibilities.\n */\n // somefilter: false\n}\n\nexport var defaultFilterCache = {\n // This is to prevent having to re-calculate default filters every time you return a filtered string\n start: '',\n end: ''\n}\n\nexport function setDefaultFilters (obj) {\n if (obj === 'clear') { // If someone calls Sqrl.setDefaultFilters('clear') it clears all default filters\n defaultFilters = {}\n } else {\n for (var key in obj) {\n if (obj.hasOwnProperty(key)) {\n defaultFilters[key] = obj[key]\n }\n }\n }\n cacheDefaultFilters()\n}\n\nexport var autoEscape = true\n\nexport function autoEscaping (bool) {\n autoEscape = bool\n return autoEscape\n}\n\nexport function cacheDefaultFilters () {\n defaultFilterCache = {\n start: '',\n end: ''\n }\n for (var key in defaultFilters) {\n if (!defaultFilters.hasOwnProperty(key) || !defaultFilters[key]) continue\n defaultFilterCache.start += 'Sqrl.F.' + key + '('\n defaultFilterCache.end += ')'\n }\n}\nexport function parseFiltered (initialString, filterString) {\n var filtersArray\n var safe = false\n var filterStart = ''\n var filterEnd = ''\n if (filterString && filterString !== '') {\n filtersArray = filterString.split('|')\n for (var i = 0; i < filtersArray.length; i++) {\n filtersArray[i] = filtersArray[i].trim() // Removing the spaces just in case someone put | filter| or | filter | or something similar\n if (filtersArray[i] === '') continue\n if (filtersArray[i] === 'safe') {\n // If 'safe' is one of the filters, set safe to true but don't add Sqrl.F.safe\n // Essentially, 'safe' is a flag telling Squirrelly not to autoEscape\n safe = true\n continue\n }\n filterStart = 'Sqrl.F.' + filtersArray[i] + '(' + filterStart\n filterEnd += ')'\n }\n }\n filterStart += defaultFilterCache.start\n filterEnd += defaultFilterCache.end\n if (!safe && autoEscape) {\n filterStart += 'Sqrl.F.e('\n filterEnd += ')'\n }\n\n return filterStart + initialString + filterEnd\n}\n\nfunction defineFilter (name, callback) {\n filters[name] = callback\n}\n\nexport { filters as default, defineFilter }\n","import { regEx, setup, replaceHelperRefs } from './regexps'\nimport nativeHelpers from './nativeHelpers'\nimport { parseFiltered } from './filters'\nimport P from './partials'\n\nfunction Compile (str) {\n var lastIndex = 0 // Because lastIndex can be complicated, and this way the minifier can minify more\n var funcStr = \"var tR='';\" // This will be called with Function() and returned\n var helperArray = [] // A list of all 'outstanding' helpers, or unclosed helpers\n var helperNumber = -1\n var helperAutoId = 0 // Squirrelly automatically generates an ID for helpers that don't have a custom ID\n var helperContainsBlocks = {} // If a helper contains any blocks, helperContainsBlocks[helperID] will be set to true\n var m\n\n function addString (indx) {\n if (lastIndex !== indx) {\n funcStr +=\n \"tR+='\" +\n str\n .slice(lastIndex, indx)\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/'/g, \"\\\\'\") +\n \"';\"\n }\n }\n function ref (content, filters) {\n // console.log('refcontent: ' + content)\n // console.log('filters: ' + filters)\n var replaced = replaceHelperRefs(content, helperArray, helperNumber)\n\n if (content[0] === '@') {\n return parseFiltered(replaced, filters)\n }\n return parseFiltered('options.' + replaced, filters)\n }\n\n setup()\n while ((m = regEx.exec(str)) !== null) {\n addString(m.index) // Add the string between the last tag (or start of file) and the current tag\n lastIndex = m[0].length + m.index\n\n if (m[1]) {\n // helper start. m[1] = helpername, m[2] = helper params, m[3] = id\n var id = m[3]\n if (id === '' || id === null) {\n id = helperAutoId\n helperAutoId++\n }\n var native = nativeHelpers.hasOwnProperty(m[1]) // true or false\n helperNumber += 1\n var params = m[2] || ''\n params = replaceHelperRefs(params, helperArray, helperNumber)\n // console.log(params)\n if (!native) {\n params = '[' + params + ']'\n }\n var helperTag = {\n name: m[1],\n id: id,\n params: params,\n native: native\n }\n helperArray[helperNumber] = helperTag\n if (native) {\n funcStr += nativeHelpers[m[1]].helperStart(params, id)\n lastIndex = regEx.lastIndex // the changeTags function sets lastIndex already\n } else {\n funcStr +=\n 'tR+=Sqrl.H.' +\n m[1] +\n '(' +\n params +\n ',function(hvals){var hvals' +\n id +\n \"=hvals;var tR='';\"\n }\n } else if (m[4]) {\n // self-closing helper. m[4] name, m[5] params\n // It's a self-closing helper\n var innerParams = m[5] || ''\n innerParams = replaceHelperRefs(innerParams, helperArray, helperNumber)\n if (m[4] === 'include') {\n // This code literally gets the template string up to the include self-closing helper,\n // adds the content of the partial, and adds the template string after the include self-closing helper\n var preContent = str.slice(0, m.index)\n var endContent = str.slice(m.index + m[0].length)\n var partialParams = innerParams.replace(/'|\"/g, '') // So people can write {{include(mypartial)/}} or {{include('mypartial')/}}\n var partialContent = P[partialParams]\n str = preContent + partialContent + endContent\n lastIndex = regEx.lastIndex = m.index\n } else if (\n nativeHelpers.hasOwnProperty(m[4]) &&\n nativeHelpers[m[4]].hasOwnProperty('selfClosing')\n ) {\n funcStr += nativeHelpers[m[4]].selfClosing(innerParams)\n lastIndex = regEx.lastIndex // changeTags sets regEx.lastIndex\n } else {\n funcStr += 'tR+=Sqrl.H.' + m[4] + '(' + innerParams + ');' // If it's not native, passing args to a non-native helper\n }\n } else if (m[6]) {\n // ref. m[6] content, m[7] filters\n funcStr += 'tR+=' + ref(m[6], m[7]) + ';'\n } else if (m[8]) {\n // helper close. m[8] name\n var mostRecentHelper = helperArray[helperNumber]\n if (mostRecentHelper && mostRecentHelper.name === m[8]) {\n helperNumber -= 1\n if (mostRecentHelper.native === true) {\n funcStr += nativeHelpers[mostRecentHelper.name].helperEnd(\n mostRecentHelper.params,\n mostRecentHelper.id\n )\n } else {\n if (helperContainsBlocks[mostRecentHelper.id]) {\n funcStr += 'return tR}});'\n } else {\n funcStr += 'return tR});'\n }\n }\n } else {\n console.error(\"Helper beginning & end don't match.\")\n }\n } else if (m[9]) {\n // helper block. m[9] name\n var parent = helperArray[helperNumber]\n if (parent.native) {\n var nativeH = nativeHelpers[parent.name]\n if (nativeH.blocks && nativeH.blocks[m[9]]) {\n funcStr += nativeH.blocks[m[9]](parent.id)\n lastIndex = regEx.lastIndex // Some native helpers set regEx.lastIndex\n } else {\n console.warn(\n \"Native helper '%s' doesn't accept that block.\",\n parent.name\n )\n }\n } else {\n if (!helperContainsBlocks[parent.id]) {\n funcStr +=\n 'return tR},{' +\n m[9] +\n ':function(hvals){var hvals' +\n parent.id +\n \"=hvals;var tR='';\"\n helperContainsBlocks[parent.id] = true\n } else {\n funcStr +=\n 'return tR},' +\n m[9] +\n ':function(hvals){var hvals' +\n parent.id +\n \"=hvals;var tR='';\"\n }\n }\n }\n }\n addString(str.length) // Add the string from the last tag-close to the end of the file, if there is one\n funcStr += 'return tR'\n var func = new Function( //eslint-disable-line\n 'options',\n 'Sqrl',\n funcStr.replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r')\n )\n return func\n}\n\nexport default Compile\n","import F from './filters'\nimport C from './compile'\nimport H from './helpers'\nimport n from './nativeHelpers'\nimport P from './partials'\n\nexport function defineFilter (name, callback) {\n F[name] = callback\n}\n\nexport function defineHelper (name, callback) {\n H[name] = callback\n}\n\nexport function defineNativeHelper (name, obj) {\n n[name] = obj\n}\n\nexport function Render (template, options) {\n // If the template parameter is a function, call that function with (options, squirrelly stuff)\n // If it's a string, first compile the string and then call the function\n if (typeof template === 'function') {\n return template(options, { H: H, F: F, P: P })\n } else if (typeof template === 'string') {\n var res = load(options, template)(options, { H: H, F: F, P: P })\n return res\n }\n}\n\nexport function definePartial (name, str) {\n P[name] = str\n}\n\nexport var cache = {}\n\nexport function load (options, str) {\n var filePath = options.$file\n var name = options.$name\n var caching = options.$cache\n\n if (filePath) {\n // If $file is passed in\n const fs = require('fs')\n if (caching !== false) {\n if (!cache.hasOwnProperty(filePath)) {\n cache[filePath] = C(fs.readFileSync(filePath, 'utf8'))\n }\n return cache[filePath]\n } else {\n return C(fs.readFileSync(filePath, 'utf8'))\n }\n } else if (str) {\n // If str is passed in\n if (name && caching !== false) {\n if (!cache.hasOwnProperty(name)) {\n cache[name] = C(str)\n }\n return cache[name]\n } else if (caching === true) {\n if (!cache.hasOwnProperty(str)) {\n cache[str] = C(str)\n }\n return cache[str]\n } else {\n return C(str)\n }\n } else if (name && caching !== false && cache.hasOwnProperty(name)) {\n // If only name is passed in and it exists in cache\n return cache[name]\n } else {\n // Neither $file nor str nor existing name is passed in\n return 'No template'\n }\n}\n\nexport function renderFile (filePath, options) {\n options.$file = filePath\n return load(options)(options, { H: H, F: F, P: P })\n}\n\nexport function __express (filePath, options, callback) {\n return callback(null, renderFile(filePath, options))\n}\n"],"names":["helpers","Partials","initialRegEx","initialTags","s","e","paramHelperRefRegExp","regEx","tags","changeTags","firstTag","secondTag","newRegEx","source","slice","length","lastIndex","RegExp","replaceHelperRefs","str","helperArray","helperNumber","replace","m","scope","id","nativeHelpers","if","helperStart","param","helperEnd","blocks","else","each","foreach","log","selfClosing","indexOf","trim","js","escMap","&","<","\"","'","replaceChar","escapeRegEx","escapeRegExTest","filters","newStr","String","test","defaultFilters","defaultFilterCache","start","end","autoEscape","parseFiltered","initialString","filterString","filtersArray","safe","filterStart","filterEnd","split","i","Compile","funcStr","helperAutoId","helperContainsBlocks","addString","indx","ref","content","replaced","exec","index","native","hasOwnProperty","params","helperTag","name","innerParams","preContent","endContent","partialParams","partialContent","P","mostRecentHelper","console","error","parent","nativeH","warn","Function","cache","load","options","filePath","$file","$name","caching","$cache","fs","require","C","readFileSync","renderFile","H","F","template","callback","bool","tagArray","obj","n","key","cacheDefaultFilters"],"mappings":"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"}