UNPKG

@stencil/dev-server

Version:

Tiny LiveReload server that watches a single directory

117 lines (116 loc) 4.37 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const path = require("path"); const url = require("url"); const fs = require("fs"); const promisify_1 = require("./promisify"); exports.fsStatPr = promisify_1.promisify(fs.stat); exports.fsReadFilePr = promisify_1.promisify(fs.readFile); exports.fsReadDirPr = promisify_1.promisify(fs.readdir); function findClosestOpenPort(host, port) { return __awaiter(this, void 0, void 0, function* () { function t(portToCheck) { return __awaiter(this, void 0, void 0, function* () { const isTaken = yield isPortTaken(host, portToCheck); if (!isTaken) { return portToCheck; } return t(portToCheck + 1); }); } return t(port); }); } exports.findClosestOpenPort = findClosestOpenPort; function isPortTaken(host, port) { return new Promise((resolve, reject) => { var net = require('net'); var tester = net.createServer() .once('error', function (err) { if (err.code !== 'EADDRINUSE') { return resolve(true); } resolve(true); }) .once('listening', function () { tester.once('close', function () { resolve(false); }) .close(); }) .on('error', (err) => { reject(err); }) .listen(port, host); }); } exports.isPortTaken = isPortTaken; function parseOptions(optionInfo, argv) { return Object.keys(optionInfo).reduce((options, key) => { let foundIndex = argv.indexOf(`--${key}`); if (foundIndex === -1) { options[key] = optionInfo[key].default; return options; } switch (optionInfo[key].type) { case Boolean: options[key] = true; break; case Number: options[key] = parseInt(argv[foundIndex + 1], 10); break; default: options[key] = argv[foundIndex + 1]; } return options; }, {}); } exports.parseOptions = parseOptions; function parseConfigFile(baseDir, filePath) { return __awaiter(this, void 0, void 0, function* () { let config = {}; try { const configFile = yield Promise.resolve().then(() => require(path.resolve(baseDir, filePath))); config = configFile.devServer || {}; } catch (err) { if (err.code === 'ENOENT' || err.code === 'ENOTDIR') { throw new Error(`The specified configFile does not exist: ${filePath}`); } if (err.code === 'EACCES') { throw new Error(`You do not have permission to read the specified configFile: ${filePath}`); } } return config; }); } exports.parseConfigFile = parseConfigFile; function getRequestedPath(requestUrl) { const parsed = url.parse(requestUrl); decodeURIComponent(requestUrl); return decodePathname(parsed.pathname || ''); } exports.getRequestedPath = getRequestedPath; function getFileFromPath(wwwRoot, requestUrl) { const pathname = getRequestedPath(requestUrl); return path.normalize(path.join(wwwRoot, path.relative('/', pathname))); } exports.getFileFromPath = getFileFromPath; function decodePathname(pathname) { const pieces = pathname.replace(/\\/g, "/").split('/'); return pieces.map((piece) => { piece = decodeURIComponent(piece); if (process.platform === 'win32' && /\\/.test(piece)) { throw new Error('Invalid forward slash character'); } return piece; }).join('/'); }