/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * strict-local * @format */ "use strict"; function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === "function") { ownKeys = ownKeys.concat( Object.getOwnPropertySymbols(source).filter(function(sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; }) ); } ownKeys.forEach(function(key) { _defineProperty(target, key, source[key]); }); } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } const nullthrows = require("nullthrows"); const parseCustomTransformOptions = require("./parseCustomTransformOptions"); const parsePlatformFilePath = require("../node-haste/lib/parsePlatformFilePath"); const url = require("url"); const _require = require("../IncrementalBundler"), revisionIdFromString = _require.revisionIdFromString; function getBoolOptionFromQuery(query, opt, defaultVal) { if (query[opt] == null) { return defaultVal; } return query[opt] === "true" || query[opt] === "1"; } function parseOptionsFromUrl(reqUrl, platforms) { // `true` to parse the query param as an object. const urlObj = nullthrows(url.parse(reqUrl, true)); const urlQuery = nullthrows(urlObj.query); const pathname = urlObj.pathname != null ? decodeURIComponent(urlObj.pathname) : ""; let bundleType = "bundle"; // Backwards compatibility. Options used to be as added as '.' to the // entry module name. We can safely remove these options. const entryFileRelativeToProjectRoot = pathname .replace(/^(?:\.?\/)?/, "./") // We want to produce a relative path to project root .split(".") .filter((part, i) => { if (part === "delta" || part === "map" || part === "meta") { bundleType = part; return false; } if ( part === "includeRequire" || part === "runModule" || part === "bundle" || part === "assets" ) { return false; } return true; }) .join("."); // try to get the platform from the url const platform = urlQuery.platform || parsePlatformFilePath(pathname, platforms).platform; const revisionId = urlQuery.revisionId || urlQuery.deltaBundleId || null; const dev = getBoolOptionFromQuery(urlQuery, "dev", true); const minify = getBoolOptionFromQuery(urlQuery, "minify", false); const excludeSource = getBoolOptionFromQuery( urlQuery, "excludeSource", false ); const inlineSourceMap = getBoolOptionFromQuery( urlQuery, "inlineSourceMap", false ); const runModule = getBoolOptionFromQuery(urlQuery, "runModule", true); const customTransformOptions = parseCustomTransformOptions(urlObj); return { revisionId: revisionId != null ? revisionIdFromString(revisionId) : null, options: { customTransformOptions, dev, hot: true, minify, platform, onProgress: null, entryFile: entryFileRelativeToProjectRoot, bundleType, sourceMapUrl: url.format( _objectSpread({}, urlObj, { // The remote chrome debugger loads bundles via Blob urls, whose // protocol is blob:http. This breaks loading source maps through // protocol-relative URLs, which is why we must force the HTTP protocol // when loading the bundle for either iOS or Android. protocol: platform != null && platform.match(/^(android|ios)$/) ? "http" : "", pathname: pathname.replace(/\.(bundle|delta)$/, ".map") }) ), runModule, excludeSource, inlineSourceMap } }; } module.exports = parseOptionsFromUrl;