{"version":3,"sources":["jsdelivr-header.js","/npm/jayli-server@0.1.0/lib/jayli.js"],"names":[],"mappings":"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","file":"/npm/jayli-server@0.1.0/lib/jayli.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/jayli-server@0.1.0/lib/jayli.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","var\n  ssiChunk = require('./xssi').ssiChunk,\n  events = require('events'),\n  fs = require('fs'),\n  url = require('url'),\n  querystring = require('querystring'),\n  chunkParser = require('./chunk').parse,\n  path = require('path');\n\nvar isUtf8 = require('./is-utf8');\nvar tidy = require('./tidy.js');\nvar mock = require('./mock.js');\nvar iconv = require('iconv-lite');\nvar Juicer = require(\"juicer\");\nvar php = require('php-template');\nvar joinbuffers = require('joinbuffers');\nJuicer.register('stringify', JSON.stringify);\n\nvar BUFFER_SIZE = 400 * 1024;\n\n/**\n * 获取自定义配置\n * @param content\n * @param reg\n */\nfunction parseParam(content, reg) {\n  var marched = content.match(reg);\n  var ret = {};\n  if (marched && marched[1]) {\n    marched[1].replace(/[\\n\\r]/g, '');\n    try {\n      ret = JSON.parse(marched[1]);\n    } catch (e) {\n      console.log('格式错误的模板变量:%s', marched[1]);\n      return {};\n    }\n    return ret;\n  }\n  return ret;\n}\n\nfunction parsePageParam(content) {\n  return parseParam(content, /<\\!--#def([\\s\\S]*?)-->/);\n}\n\nfunction delPageParamArea(content) {\n  return content.replace(/<\\!--#def([\\s\\S]*?)-->/, '');\n}\n\nexports.filepath = function (webroot, url) {\n  webroot = path.resolve(webroot || '.');\n  var pathSep = process.platform == 'win32' ? '\\\\' : '/';\n  // Unescape URL to prevent security holes\n  url = decodeURIComponent(url);\n  // Strip nullbytes (they can make us believe that the file extension isn't the one it really is)\n  url = url.replace(/\\0/g, '');\n  // Append index.html if path ends with '/'\n  var fp = path.normalize(path.join(webroot, (url.match(/\\/$/) == '/') ? url + 'index.html' : url));\n  // Sanitize input, make sure people can't use .. to get above webroot\n  if (webroot[webroot.length - 1] !== pathSep) webroot += pathSep;\n  if (fp.substr(0, webroot.length) != webroot)\n    return (['Permission Denied', null]);\n  else\n    return ([null, fp.replace('/', pathSep)]);\n};\n\n\nexports.streamFile = function (filepath, headerFields, stat, res, req) {\n  var\n    emitter = new events.EventEmitter(),\n    extension = filepath.split('.').pop(),\n    contentType = exports.contentTypes[extension] || 'application/octet-stream',\n    charset = exports.charsets[contentType];\n\n  process.nextTick(function () {\n    if (charset)\n      contentType += '; charset=' + charset;\n    headerFields['Content-Type'] = contentType;\n\n    var etag = '\"' + stat.ino + '-' + stat.size + '-' + Date.parse(stat.mtime) + '\"';\n    headerFields['ETag'] = etag;\n\n    // last-modified date should be present along with etag\n    // also in a client-side JavaScript, document.lastModified uses this header value\n    headerFields['Last-Modified'] = new Date(stat.mtime);\n\n    var statCode;\n    //Check to see if we can send a 304 and skip the send\n    if (req.headers['if-none-match'] == etag && !/(html|shtml|php|xhtml|htm)/i.test(extension)) {\n      statCode = 304;\n      headerFields['Content-Length'] = 0;\n    } else {\n      // headerFields['Content-Length'] = stat.size;\n      statCode = 200;\n      if (headerFields['Expires'] != undefined) {\n        var expires = new Date;\n        expires.setTime(expires.getTime() + headerFields['Expires']);\n        headerFields['Expires'] = expires.toUTCString();\n      }\n    }\n\n\n    //If we sent a 304, skip sending a body\n    if (statCode == 304 || req.method === 'HEAD') {\n      res.writeHead(statCode, headerFields);\n      res.end();\n      emitter.emit(\"success\", statCode);\n    }\n    else {\n\n      var fileBuffer = [],\n        encoding;\n\n      fs.createReadStream(filepath, {\n        'flags': 'r',\n        'mode': 0666, 'bufferSize': BUFFER_SIZE\n      })\n        .addListener(\"data\", function (chunk) {\n          encoding = 'binary';\n          var isPHP = /php/i.test(path.extname(filepath));\n          if (/(html|shtml|php|xhtml|htm)/i.test(path.extname(filepath))) {\n            encoding = isUtf8(chunk) ? 'utf8' : 'gbk';\n            if (encoding == 'gbk') {\n              chunk = iconv.encode(iconv.decode(chunk, 'gbk'), 'utf8');\n            }\n\n            chunk = ssiChunk(filepath, chunk.toString('utf8'));\n\n            if (isPHP) {\n              var tf = generatorTmpFile(filepath, chunk);\n              var urlObj = querystring.parse(url.parse(req.url).query);\n              php(tf, urlObj, function (err, response) { /* ... */\n                fs.unlinkSync(tf);\n                if (err) {\n                  chunk = '' + err;\n                  chunk = teardownChunk(chunk, encoding);\n                  doResponse(res, chunk, headerFields, encoding, 500);\n                } else {\n                  chunk = response;\n                  chunk = mockFilter(chunk);\n                  chunk = teardownChunk(chunk, encoding);\n\n                  fileBuffer.push(chunk);\n                  //doResponse(res, chunk, headerFields, encoding, statCode);\n                }\n              });\n            } else {\n              // Mock 数据解析\n              chunk = mockFilter(chunk);\n              chunk = teardownChunk(chunk, encoding);\n\n              fileBuffer.push(chunk);\n              //doResponse(res, chunk, headerFields, encoding, statCode);\n            }\n\n          } else {\n            res.writeHead(statCode, headerFields);\n            fileBuffer.push(chunk);\n            //res.write(chunk, encoding);\n          }\n        })\n        .addListener(\"end\", function () {\n          res.writeHead(statCode, headerFields);\n          emitter.emit(\"success\", {\n            statCode: statCode,\n            fileBuffer: joinbuffers(fileBuffer),\n            headerFields: headerFields,\n            encoding: encoding\n          });\n        })\n        .addListener(\"close\", function () {\n          res.writeHead(statCode, headerFields);\n          setTimeout(function () {\n            res.end();\n          }, 4000);\n        })\n        .addListener(\"error\", function (e) {\n          res.writeHead(statCode, headerFields);\n          emitter.emit(\"error\", 500, e);\n        });\n    }\n  });\n  return emitter;\n};\n\nexports.deliver = function (webroot, req, res, filepath) {\n  var\n    stream,\n    fpRes = exports.filepath(webroot, url.parse(req.url).pathname),\n    fpErr = fpRes[0],\n  // filepath = fpRes[1],\n    beforeCallback,\n    afterCallback,\n    otherwiseCallback,\n    errorCallback,\n    headerFields = {},\n    addHeaderCallback,\n    delegate = {\n      error: function (callback) {\n        errorCallback = callback;\n        return delegate;\n      },\n      before: function (callback) {\n        beforeCallback = callback;\n        return delegate;\n      },\n      after: function (callback) {\n        afterCallback = callback;\n        return delegate;\n      },\n      otherwise: function (callback) {\n        otherwiseCallback = callback;\n        return delegate;\n      },\n      addHeader: function (name, value) {\n        headerFields[name] = value;\n        return delegate;\n      }\n    };\n\n  process.nextTick(function () {\n    // Create default error and otherwise callbacks if none were given.\n    errorCallback = errorCallback || function (statCode) {\n        res.writeHead(statCode, {'Content-Type': 'text/html'});\n        res.end(\"<h1>HTTP \" + statCode + \"</h1>\");\n      };\n    otherwiseCallback = otherwiseCallback || function () {\n        res.writeHead(404, {'Content-Type': 'text/html'});\n        res.end(\"<h1>HTTP 404 File not found</h1>\");\n      };\n\n    //If file is in a directory outside of the webroot, deny the request\n    if (fpErr) {\n      statCode = 403;\n      if (beforeCallback)\n        beforeCallback();\n      errorCallback(403, 'Forbidden');\n    }\n    else {\n      fs.stat(filepath, function (err, stat) {\n        if ((err || !stat.isFile())) {\n          var exactErr = err || 'File not found';\n          if (beforeCallback)\n            beforeCallback();\n          if (otherwiseCallback)\n            otherwiseCallback(exactErr);\n        } else {\n          //The before callback can abort the transfer by returning false\n          var cancel = beforeCallback && (beforeCallback() === false);\n          if (cancel && otherwiseCallback) {\n            otherwiseCallback();\n          }\n          else {\n            stream = exports.streamFile(filepath, headerFields, stat, res, req);\n\n            if (afterCallback) {\n              stream.addListener(\"success\", function (data) {\n\n                var statCode = data.statCode,\n                  fileBuffer = data.fileBuffer,\n                  encoding = data.encoding,\n                  headerFields = data.headerFields;\n\n                // 调用配置的回调，将调用者的处理结果返回\n                var fileProcResult = afterCallback(statCode, filepath, fileBuffer, encoding);\n                // 如果afterCallback 返回 null，处理一下\n                fileProcResult = fileProcResult || fileBuffer;\n\n                // 输出响应\n                doResponse(res, fileProcResult, headerFields, encoding, statCode);\n              });\n            }\n            if (errorCallback) {\n              stream.addListener(\"error\", errorCallback);\n            }\n          }\n        }\n      });\n    }\n  });\n\n  return delegate;\n};\n\nexports.contentTypes = {\n  \"aiff\": \"audio/x-aiff\",\n  \"arj\": \"application/x-arj-compressed\",\n  \"asf\": \"video/x-ms-asf\",\n  \"asx\": \"video/x-ms-asx\",\n  \"au\": \"audio/ulaw\",\n  \"avi\": \"video/x-msvideo\",\n  \"bcpio\": \"application/x-bcpio\",\n  \"ccad\": \"application/clariscad\",\n  \"cod\": \"application/vnd.rim.cod\",\n  \"com\": \"application/x-msdos-program\",\n  \"cpio\": \"application/x-cpio\",\n  \"cpt\": \"application/mac-compactpro\",\n  \"csh\": \"application/x-csh\",\n  \"css\": \"text/css\",\n  \"cur\": \"image/vnd.microsoft.icon\",\n  \"deb\": \"application/x-debian-package\",\n  \"dl\": \"video/dl\",\n  \"doc\": \"application/msword\",\n  \"drw\": \"application/drafting\",\n  \"dvi\": \"application/x-dvi\",\n  \"dwg\": \"application/acad\",\n  \"dxf\": \"application/dxf\",\n  \"dxr\": \"application/x-director\",\n  \"etx\": \"text/x-setext\",\n  \"ez\": \"application/andrew-inset\",\n  \"fli\": \"video/x-fli\",\n  \"flv\": \"video/x-flv\",\n  \"gif\": \"image/gif\",\n  \"gl\": \"video/gl\",\n  \"gtar\": \"application/x-gtar\",\n  \"gz\": \"application/x-gzip\",\n  \"hdf\": \"application/x-hdf\",\n  \"hqx\": \"application/mac-binhex40\",\n  \"htm\": \"text/html\",\n  \"html\": \"text/html\",\n  \"ice\": \"x-conference/x-cooltalk\",\n  \"ico\": \"image/x-icon\",\n  \"ief\": \"image/ief\",\n  \"igs\": \"model/iges\",\n  \"ips\": \"application/x-ipscript\",\n  \"ipx\": \"application/x-ipix\",\n  \"jad\": \"text/vnd.sun.j2me.app-descriptor\",\n  \"jar\": \"application/java-archive\",\n  \"jpeg\": \"image/jpeg\",\n  \"jpg\": \"image/jpeg\",\n  \"js\": \"text/javascript\",\n  \"json\": \"application/json\",\n  \"latex\": \"application/x-latex\",\n  \"lsp\": \"application/x-lisp\",\n  \"lzh\": \"application/octet-stream\",\n  \"m\": \"text/plain\",\n  \"m3u\": \"audio/x-mpegurl\",\n  \"man\": \"application/x-troff-man\",\n  \"manifest\": \"text/cache-manifest\",\n  \"me\": \"application/x-troff-me\",\n  \"midi\": \"audio/midi\",\n  \"mif\": \"application/x-mif\",\n  \"mime\": \"www/mime\",\n  \"movie\": \"video/x-sgi-movie\",\n  \"mp4\": \"video/mp4\",\n  \"mpg\": \"video/mpeg\",\n  \"mpga\": \"audio/mpeg\",\n  \"ms\": \"application/x-troff-ms\",\n  \"nc\": \"application/x-netcdf\",\n  \"oda\": \"application/oda\",\n  \"ogm\": \"application/ogg\",\n  \"pbm\": \"image/x-portable-bitmap\",\n  \"pdf\": \"application/pdf\",\n  \"pgm\": \"image/x-portable-graymap\",\n  \"pgn\": \"application/x-chess-pgn\",\n  \"pgp\": \"application/pgp\",\n  \"pm\": \"application/x-perl\",\n  \"png\": \"image/png\",\n  \"pnm\": \"image/x-portable-anymap\",\n  \"ppm\": \"image/x-portable-pixmap\",\n  \"ppz\": \"application/vnd.ms-powerpoint\",\n  \"pre\": \"application/x-freelance\",\n  \"prt\": \"application/pro_eng\",\n  \"ps\": \"application/postscript\",\n  \"qt\": \"video/quicktime\",\n  \"ra\": \"audio/x-realaudio\",\n  \"rar\": \"application/x-rar-compressed\",\n  \"ras\": \"image/x-cmu-raster\",\n  \"rgb\": \"image/x-rgb\",\n  \"rm\": \"audio/x-pn-realaudio\",\n  \"rpm\": \"audio/x-pn-realaudio-plugin\",\n  \"rtf\": \"text/rtf\",\n  \"rtx\": \"text/richtext\",\n  \"scm\": \"application/x-lotusscreencam\",\n  \"set\": \"application/set\",\n  \"sgml\": \"text/sgml\",\n  \"sh\": \"application/x-sh\",\n  \"shar\": \"application/x-shar\",\n  \"silo\": \"model/mesh\",\n  \"sit\": \"application/x-stuffit\",\n  \"skt\": \"application/x-koan\",\n  \"smil\": \"application/smil\",\n  \"snd\": \"audio/basic\",\n  \"sol\": \"application/solids\",\n  \"spl\": \"application/x-futuresplash\",\n  \"src\": \"application/x-wais-source\",\n  \"stl\": \"application/SLA\",\n  \"stp\": \"application/STEP\",\n  \"sv4cpio\": \"application/x-sv4cpio\",\n  \"sv4crc\": \"application/x-sv4crc\",\n  \"svg\": \"image/svg+xml\",\n  \"swf\": \"application/x-shockwave-flash\",\n  \"tar\": \"application/x-tar\",\n  \"tcl\": \"application/x-tcl\",\n  \"tex\": \"application/x-tex\",\n  \"texinfo\": \"application/x-texinfo\",\n  \"tgz\": \"application/x-tar-gz\",\n  \"tiff\": \"image/tiff\",\n  \"tr\": \"application/x-troff\",\n  \"tsi\": \"audio/TSP-audio\",\n  \"tsp\": \"application/dsptype\",\n  \"tsv\": \"text/tab-separated-values\",\n  \"txt\": \"text/plain\",\n  \"unv\": \"application/i-deas\",\n  \"ustar\": \"application/x-ustar\",\n  \"vcd\": \"application/x-cdlink\",\n  \"vda\": \"application/vda\",\n  \"vivo\": \"video/vnd.vivo\",\n  \"vrm\": \"x-world/x-vrml\",\n  \"wav\": \"audio/x-wav\",\n  \"wax\": \"audio/x-ms-wax\",\n  \"wma\": \"audio/x-ms-wma\",\n  \"wmv\": \"video/x-ms-wmv\",\n  \"wmx\": \"video/x-ms-wmx\",\n  \"wrl\": \"model/vrml\",\n  \"wvx\": \"video/x-ms-wvx\",\n  \"xbm\": \"image/x-xbitmap\",\n  \"xlw\": \"application/vnd.ms-excel\",\n  \"xml\": \"text/xml\",\n  \"xpm\": \"image/x-xpixmap\",\n  \"xwd\": \"image/x-xwindowdump\",\n  \"xyz\": \"chemical/x-pdb\",\n  \"zip\": \"application/zip\",\n  \"php\": \"text/html\",\n  \"less\": \"text/css\",\n  \"scss\": \"text/css\"\n};\n\nexports.charsets = {\n  'text/javascript': 'UTF-8',\n  'text/html': 'UTF-8'\n};\n\n// 一定是 utf8 的内容\nfunction generatorTmpFile(filepath, data) {\n  var tfn = filepath + '.' + Math.random().toString().replace('.', '');\n  fs.writeFileSync(tfn, data, {\n    encoding: 'utf8'\n  });\n  return tfn;\n}\n\n// 一定是utf8格式\nfunction mockFilter(chunk) {\n  if (mock.checkDef(chunk)) {\n    var pageParam = mock.getMockData(chunk);\n    chunk = Juicer(chunk, pageParam);\n    // chunk = delPageParamArea(chunk);\n    // tidy 对 行内script 中的注释支持有问题，暂时去掉\n    // chunk = tidy(chunk);\n  }\n  return chunk;\n}\n\n// 传入的chunk一定是utf8的\nfunction teardownChunk(chunk, encoding) {\n  if (!(chunk instanceof Buffer)) {\n    chunk = new Buffer(chunk);\n  }\n  if (encoding == 'gbk') {\n    chunk = iconv.encode(iconv.decode(chunk, 'utf8'), 'gbk');\n  }\n  return chunk;\n}\n\n// chunk 一定是二进制的\nfunction doResponse(res, chunk, headerFields, encoding, statCode) {\n  headerFields['Content-Type'] = headerFields['Content-Type'].replace(/charset=(.+)$/i, 'charset=' + encoding);\n  res.writeHead(statCode, headerFields);\n  chunkParser(chunk, function (chunk) {\n    chunk = teardownChunk(chunk, encoding);\n    headerFields['Content-Length'] = chunk.length;\n    res.write(chunk);\n    res.end();\n  });\n}\n"]}