{"version":3,"sources":["jsdelivr-header.js","/npm/import-map-deployer@7.0.0/src/web-server.js"],"names":[],"mappings":"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","file":"/npm/import-map-deployer@7.0.0/src/web-server.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/import-map-deployer@7.0.0/src/web-server.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","//Setup\n\"use strict\";\nrequire(\"dotenv\").config();\n\nconst express = require(\"express\"),\n  bodyParser = require(\"body-parser\"),\n  app = express(),\n  ioOperations = require(\"./io-operations.js\"),\n  modify = require(\"./modify.js\"),\n  healthCheck = require(\"./health-check.js\"),\n  auth = require(\"./auth.js\"),\n  envHelpers = require(\"./environment-helpers.js\"),\n  _ = require(\"lodash\"),\n  morgan = require(\"morgan\"),\n  {\n    verifyValidUrl,\n    findUrlsToValidateInScopes,\n    findUrlsToValidateInServices,\n    findUrlsToValidateInIntegrity,\n  } = require(\"./verify-valid-url.js\"),\n  {\n    verifyInputFormatForServices,\n    verifyInputFormatForScopes,\n  } = require(\"./verify-valid-input-format\"),\n  getConfig = require(\"./config.js\").getConfig,\n  setConfig = require(\"./config.js\").setConfig,\n  { checkUrlUnsafe } = require(\"./trusted-urls\");\n\nif (process.env.NODE_ENV !== \"test\") {\n  healthCheck.runCheck().catch((ex) => {\n    console.error(ex);\n    console.error(\"Killing web server because initial health check failed\");\n    process.exit(1);\n  });\n}\n\napp.set(\"etag\", false);\napp.use(bodyParser.text({ type: \"*/*\" }));\napp.use(\n  morgan(\n    function (tokens, req, res) {\n      return [\n        tokens.method(req, res),\n        tokens.url(req, res),\n        tokens.status(req, res),\n        JSON.stringify(req.body),\n      ].join(\" \");\n    },\n    {\n      skip: (req, res) => {\n        return (\n          (req.url === \"/health\" || req.url === \"/\") && res.statusCode == 200\n        );\n      },\n    }\n  )\n);\napp.use(auth);\napp.use(express.static(__dirname + \"/public\"));\n\nfunction getEnv(req) {\n  return req.query.env;\n}\n\nfunction sendError(res, ex, prefix) {\n  console.error(ex);\n  const status =\n    ex && ex.message && /No such environment/.test(ex.message) ? 404 : 500;\n  res.status(status).send(`${prefix} -- ${ex.toString()}`);\n}\n\n// --------- //\n// ENDPOINTS //\n// --------- //\n// app.get('/', function(req, res) {\n//   res.send(`try doing a GET on /sofe-manifest, a PATCH on /services, or a DELETE on /services/:serviceName`)\n// })\n\napp.get(\"/environments\", function (req, res) {\n  res.send({\n    environments: notEmpty(envHelpers.getEnvNames()).map(toEnvObject),\n  });\n\n  function notEmpty(envs) {\n    return envs.length > 0 ? envs : [\"default\"];\n  }\n\n  function toEnvObject(name) {\n    return {\n      name: name,\n      isDefault: isDefault(name),\n      aliases: aliases(name),\n    };\n  }\n\n  function isDefault(name) {\n    return (\n      name === \"default\" ||\n      envHelpers.getEnvLocation(name) === envHelpers.getEnvLocation(\"default\")\n    );\n  }\n\n  function aliases(envName) {\n    return envHelpers.getEnvNames().filter((name) => {\n      return (\n        envName !== name &&\n        envHelpers.getEnvLocation(name) === envHelpers.getEnvLocation(envName)\n      );\n    });\n  }\n});\n\napp.get(\"/sofe-manifest.json\", handleGetManifest);\napp.get(\"/import-map.json\", handleGetManifest);\n\nfunction handleGetManifest(req, res) {\n  let env = getEnv(req);\n  ioOperations\n    .readManifest(env)\n    .then((data) => {\n      var json = JSON.parse(data);\n      res.send(json);\n    })\n    .catch((ex) => {\n      console.error(ex);\n      sendError(res, ex, \"Could not read import map\");\n    });\n}\n\napp.patch(\"/import-map.json\", (req, res) => {\n  const env = getEnv(req);\n  try {\n    req.body = JSON.parse(req.body);\n  } catch (err) {\n    console.error(err);\n    res\n      .status(400)\n      .send(\"Patching the import map requires a json request body\");\n    return;\n  }\n  if (req.body.imports) {\n    const inputFormatIssues = verifyInputFormatForServices(req.body.imports);\n    if (inputFormatIssues.length > 0) {\n      res.status(400).send(inputFormatIssues.join(\"\\n\"));\n      return;\n    }\n  }\n  if (req.body.scopes) {\n    if (getConfig().manifestFormat !== \"importmap\") {\n      return res\n        .status(400)\n        .send(\n          `Invalid import map in request body -- scopes are only supported with manifest format \"importmap\"`\n        );\n    }\n\n    const inputFormatIssues = verifyInputFormatForScopes(req.body.scopes);\n    if (inputFormatIssues.length > 0) {\n      res.status(400).send(inputFormatIssues.join(\"\\n\"));\n      return;\n    }\n  }\n\n  // Import map validation\n  let validImportUrlPromises = [];\n  if (req.body.imports) {\n    const importUrlsToValidate = findUrlsToValidateInServices(req.body.imports);\n    const unsafeUrls = importUrlsToValidate.map(checkUrlUnsafe).filter(Boolean);\n\n    if (unsafeUrls.length > 0) {\n      return res.status(400).send({\n        error: `The following URLs are not trusted - ${unsafeUrls.join(\", \")}`,\n      });\n    }\n\n    if (importUrlsToValidate.length > 0) {\n      validImportUrlPromises = importUrlsToValidate.map((url) =>\n        verifyValidUrl(req, url)\n      );\n    }\n  }\n\n  // Scope validation\n  let validScopeUrlPromises = [];\n  if (req.body.scopes) {\n    const scopeUrlsToValidate = findUrlsToValidateInScopes(req.body.scopes);\n    const unsafeUrls = scopeUrlsToValidate.map(checkUrlUnsafe).filter(Boolean);\n\n    if (unsafeUrls.length > 0) {\n      return res.status(400).send({\n        error: `The following URLs are not trusted - ${unsafeUrls.join(\", \")}`,\n      });\n    }\n\n    if (scopeUrlsToValidate.length > 0) {\n      validScopeUrlPromises = scopeUrlsToValidate.map((url) =>\n        verifyValidUrl(req, url)\n      );\n    }\n  }\n\n  let validIntegrityUrlPromises = [];\n  if (req.body.integrity) {\n    const integrityUrlsToValidate = findUrlsToValidateInIntegrity(\n      req.body.integrity\n    );\n    const unsafeUrls = integrityUrlsToValidate\n      .map(checkUrlUnsafe)\n      .filter(Boolean);\n\n    if (unsafeUrls.length > 0) {\n      return res.status(400).send({\n        error: `The following URLs are not trusted - ${unsafeUrls.join(\", \")}`,\n      });\n    }\n\n    if (integrityUrlsToValidate.length > 0) {\n      validIntegrityUrlPromises = integrityUrlsToValidate.map((url) =>\n        verifyValidUrl(req, url)\n      );\n    }\n  }\n\n  return Promise.all([\n    ...validImportUrlPromises,\n    ...validScopeUrlPromises,\n    ...validIntegrityUrlPromises,\n  ])\n    .then(() => {\n      modify\n        .modifyImportMap(env, {\n          services: req.body.imports,\n          scopes: req.body.scopes,\n          integrity: req.body.integrity,\n        })\n        .then((newImportMap) => {\n          res.status(200).send(newImportMap);\n        })\n        .catch((err) => {\n          sendError(res, err, \"Could not update import map\");\n        });\n    })\n    .catch((err) => {\n      res.status(400).send(err.message);\n    });\n});\n\napp.get(\"/\", healthEndpoint);\napp.get(\"/health\", healthEndpoint);\n\nfunction healthEndpoint(req, res) {\n  res.send({\n    message: \"import-map-deployer is running\",\n  });\n}\n\napp.patch(\"/services\", function (req, res) {\n  req.body = JSON.parse(req.body);\n  let service, url, integrity;\n  let env = getEnv(req);\n  if (req.body != undefined && req.body.hasOwnProperty(\"service\")) {\n    service = req.body.service;\n  } else {\n    return res.status(400).send(\"service key is missing\");\n  }\n  if (!service || service.trim().length === 0) {\n    return res\n      .status(400)\n      .send(`Invalid service key - \"${service}\" is an invalid service key`);\n  }\n  if (req.body != undefined && req.body.hasOwnProperty(\"url\")) {\n    url = req.body.url;\n  } else {\n    return res.status(400).send(\"url key is missing\");\n  }\n  if (req.body?.hasOwnProperty(\"integrity\")) {\n    if (\n      typeof req.body.integrity !== \"string\" ||\n      req.body.integrity.trim().length === 0\n    ) {\n      return res\n        .status(400)\n        .send(`Invalid integrity - must be a non-empty string`);\n    }\n    integrity = req.body.integrity;\n  }\n\n  let packageDirLevel =\n    req.query.packageDirLevel && req.query.packageDirLevel !== \"\"\n      ? Math.floor(req.query.packageDirLevel)\n      : 1;\n\n  if (req.query.packageDirLevel && isNaN(packageDirLevel)) {\n    return res\n      .status(400)\n      .send(\n        `Query parameter packageDirLevel (${packageDirLevel}) should be of type number`\n      );\n  }\n\n  if (checkUrlUnsafe(url)) {\n    return res.status(400).send({\n      error: `URL is not trusted (${url})`,\n    });\n  }\n\n  verifyValidUrl(req, url)\n    .then(() => {\n      modify\n        .modifyService(env, service, url, false, packageDirLevel, integrity)\n        .then((json) => {\n          res.send(json);\n        })\n        .catch((ex) => {\n          sendError(res, ex, \"Could not patch service\");\n        });\n    })\n    .catch((err) => {\n      res.status(400).send(err.message);\n    });\n});\n\napp.delete(\"/services/:serviceName\", function (req, res) {\n  let env = getEnv(req);\n  modify\n    .modifyService(env, req.params.serviceName, null, true)\n    .then((data) => {\n      res.send(data);\n    })\n    .catch((ex) => {\n      sendError(res, ex, \"Could not delete service\");\n    });\n});\n\nlet server;\nif (process.env.NODE_ENV !== \"test\") {\n  server = app.listen(\n    process.env.PORT || getConfig().port || 5000,\n    function () {\n      console.log(\"Listening at http://localhost:%s\", server.address().port);\n    }\n  );\n\n  exports.close = server.close;\n}\n\nexports.app = app;\nexports.setConfig = setConfig;\n"]}