{"version":3,"sources":["jsdelivr-header.js","/npm/milo@0.0.8/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACFA,aAEA,IAAI,GAAK,QAAQ,MACf,QAAU,QAAQ,WAClB,WAAa,QAAQ,cACrB,KAAO,QAAQ,QACf,KAAO,QAAQ,QACf,EAAI,QAAQ,cAEd,EAAE,IAAM,QAAQ,qBAChB,EAAE,MAAM,EAAE,IAAI,WAEd,IAAI,IAAM,UAIN,YAAc,QAAQ,sBACxB,cAAgB,QAAQ,wBAEtB,SAAW,CACb,KAAQ,KAGV,OAAO,QAAQ,QAAU,QAEzB,OAAO,QAAQ,IAAM,WACnB,IAAI,IAAI,MAAM,IAAK,UACrB,EAEA,OAAO,QAAQ,KAAO,SAAS,GAE7B,EAAS,EAAE,OAAO,SAAU,GAE5B,IAAI,EAAQ,GA2DZ,EAAE,KAAK,EAAO,YAAY,SAAS,GACjC,IAAI,IAAI,EAAW,QAAQ,OAAO,EAAO,OAAS,GACpD,IAEA,GAAG,QAAQ,EAAO,WAAW,SAAS,EAAK,GAEzC,EAAE,KAAK,GAAO,SAAS,GA/DT,IAAS,EAiES,SAA1B,EAAK,MAAM,KAAK,QAElB,EAAO,GAAG,aAAa,EAAO,UAAY,IAAM,GAAM,WAnEnC,EAwET,KAAK,MAAM,WAAW,IAtEpC,IAAI,IAAI,EAAU,OAAO,SAAS,EAAK,EAAK,GAE1C,IAAI,EAAa,EAAO,WAAa,IAAM,EAAE,QAAQ,EAAE,SAAS,EAAU,SAAW,QAEjF,EAAO,CAAC,EASZ,GARA,EAAK,KAAO,EAAI,OAEhB,EAAE,OAAO,EAAM,GACf,EAAE,OAAO,EAAM,YAAY,EAAQ,IAK/B,cAAc,EAAQ,IACxB,GAAI,EAAK,OAAQ,CAIf,GAFA,EAAI,UAAU,KAEV,EAAM,EAAI,KAEZ,YADA,EAAI,IAAI,EAAM,EAAI,MAIpB,IAAI,EAAe,KAAK,WAAW,EAAY,GAC7C,EAAS,KAAK,YAAY,EAAc,CACtC,YAAe,IAGf,EAAK,MACP,EAAM,EAAI,KAAO,EACjB,YAAW,WACT,EAAM,EAAI,KAAO,IACnB,GAAG,EAAK,MAGV,EAAI,IAAI,EAEV,MAAO,GAAI,EAAK,QAAS,CACvB,IAAI,EAAW,QAAQ,QAAQ,MAAQ,IAAM,EAAO,YAAc,IAAM,EAAK,SAE7E,EAAE,KAAK,GAAU,SAAS,GACxB,EAAQ,EAAK,EAAK,EACpB,GACF,OAEA,EAAI,UAAU,KACd,EAAI,IAAI,kBAEZ,IAAG,WAEH,IAuBA,IAKA,IAAI,IAAI,KAAK,SAAS,EAAK,GACzB,EAAI,UAAU,KACd,EAAI,IAAI,kBACV,IAEA,QAAQ,IAAI,uCACZ,QAAQ,IAAI,kCAAoC,EAAO,MACvD,QAAQ,IAAI,yCAEZ,IAAI,OAAO,EAAO,KACpB,GACF","file":"/npm/milo@0.0.8/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/milo@0.0.8/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","// ---------------------------\n// This is Milo's initializer.\n// ---------------------------\n\n'use strict';\n\nvar fs = require('fs'),\n  express = require('express'),\n  jsonMinify = require('jsonminify'),\n  jade = require('jade'),\n  html = require('html'),\n  _ = require('underscore');\n\n_.str = require('underscore.string');\n_.mixin(_.str.exports());\n\nvar app = express();\n\n// Milo Library Modules\n\nvar jadeHelpers = require('./lib/jade-helpers'),\n  routeValidate = require('./lib/validate-route');\n\nvar defaults = {\n  'port': 3000\n};\n\nmodule.exports.express = express;\n\nmodule.exports.use = function() {\n  app.use.apply(app, arguments);\n};\n\nmodule.exports.init = function(config) {\n\n  config = _.extend(defaults, config);\n\n  var cache = [];\n\n  var bindRoute = function(routeFile) {\n\n    app.get(routeFile.route, function(req, res, next) {\n\n      var layoutPath = config.layoutsDir + '/' + _.slugify(_.humanize(routeFile.layout)) + '.jade';\n\n      var data = {};\n      data.path = req.params;\n\n      _.extend(data, routeFile);\n      _.extend(data, jadeHelpers(config, data));\n\n      // Validate that the matched request meets all of the validation criteria\n      // Set out in the route's JSON file.\n\n      if (routeValidate(config, data)) {\n        if (data.layout) {\n\n          res.writeHead(200);\n\n          if (cache[req.url]) {\n            res.end(cache[req.url]);\n            return;\n          }\n\n          var renderedJade = jade.renderFile(layoutPath, data),\n            output = html.prettyPrint(renderedJade, {\n              'indent_size': 2\n            });\n\n          if (data.ttl) {\n            cache[req.url] = output;\n            setTimeout(function() {\n              cache[req.url] = null;\n            }, data.ttl);\n          }\n\n          res.end(output);\n\n        } else if (data.service) {\n          var services = require(process.cwd() + '/' + config.servicesDir + '/' + data.service);\n\n          _.each(services, function(service) {\n            service(req, res, next);\n          });\n        }\n      } else {\n        res.writeHead(404);\n        res.end('404 - NOT FOUND');\n      }\n    }, function() {\n      // Do nothing.\n    });\n  };\n\n  // Bind static directories.\n\n  _.each(config.staticDirs, function(staticDir) {\n    app.use(staticDir, express.static(config.appDir + staticDir));\n  });\n\n  fs.readdir(config.routesDir, function(err, files) {\n\n    _.each(files, function(file) {\n\n      if (file.split('.').pop() === 'json') {\n\n        file = fs.readFileSync(config.routesDir + '/' + file).toString();\n\n        // I like having comments in the routes file, as they will likely be logical.\n        // `.minify` strips comments out before parsing.\n\n        bindRoute(JSON.parse(jsonMinify(file)));\n      }\n\n    });\n\n    // Temporary. 404 should probably be part of the base install...\n    // I need it in a few places.\n\n    app.get('*', function(req, res) {\n      res.writeHead(404);\n      res.end('404 - NOT FOUND');\n    });\n\n    console.log('-----------------------------------');\n    console.log('Milo is listening on localhost:' + config.port);\n    console.log('-----------------------------------\\n');\n\n    app.listen(config.port);\n  });\n};"]}