index.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. exports.createServer = exports.rewriteImports = void 0;
  7. const path_1 = __importDefault(require("path"));
  8. const fs_extra_1 = __importDefault(require("fs-extra"));
  9. const koa_1 = __importDefault(require("koa"));
  10. const chokidar_1 = __importDefault(require("chokidar"));
  11. const resolver_1 = require("../resolver");
  12. const serverPluginModuleRewrite_1 = require("./serverPluginModuleRewrite");
  13. const serverPluginModuleResolve_1 = require("./serverPluginModuleResolve");
  14. const serverPluginVue_1 = require("./serverPluginVue");
  15. const serverPluginHmr_1 = require("./serverPluginHmr");
  16. const serverPluginServeStatic_1 = require("./serverPluginServeStatic");
  17. const serverPluginJson_1 = require("./serverPluginJson");
  18. const serverPluginCss_1 = require("./serverPluginCss");
  19. const serverPluginAssets_1 = require("./serverPluginAssets");
  20. const serverPluginEsbuild_1 = require("./serverPluginEsbuild");
  21. const transform_1 = require("../transform");
  22. const serverPluginHtml_1 = require("./serverPluginHtml");
  23. const serverPluginProxy_1 = require("./serverPluginProxy");
  24. const createCertificate_1 = require("../utils/createCertificate");
  25. const utils_1 = require("../utils");
  26. const serverPluginEnv_1 = require("./serverPluginEnv");
  27. var serverPluginModuleRewrite_2 = require("./serverPluginModuleRewrite");
  28. Object.defineProperty(exports, "rewriteImports", { enumerable: true, get: function () { return serverPluginModuleRewrite_2.rewriteImports; } });
  29. const serverPluginSourceMap_1 = require("./serverPluginSourceMap");
  30. const serverPluginWebWorker_1 = require("./serverPluginWebWorker");
  31. const serverPluginWasm_1 = require("./serverPluginWasm");
  32. const serverPluginClient_1 = require("./serverPluginClient");
  33. function createServer(config) {
  34. const { root = process.cwd(), configureServer = [], resolvers = [], alias = {}, transforms = [], vueCustomBlockTransforms = {}, optimizeDeps = {}, enableEsbuild = true, assetsInclude } = config;
  35. const app = new koa_1.default();
  36. const server = resolveServer(config, app.callback());
  37. const watcher = chokidar_1.default.watch(root, {
  38. ignored: [/node_modules/, /\.git/],
  39. // #610
  40. awaitWriteFinish: {
  41. stabilityThreshold: 100,
  42. pollInterval: 10
  43. }
  44. });
  45. const resolver = resolver_1.createResolver(root, resolvers, alias, assetsInclude);
  46. const context = {
  47. root,
  48. app,
  49. server,
  50. watcher,
  51. resolver,
  52. config,
  53. // port is exposed on the context for hmr client connection
  54. // in case the files are served under a different port
  55. port: config.port || 3000
  56. };
  57. // attach server context to koa context
  58. app.use((ctx, next) => {
  59. Object.assign(ctx, context);
  60. ctx.read = utils_1.cachedRead.bind(null, ctx);
  61. return next();
  62. });
  63. // cors
  64. if (config.cors) {
  65. app.use(require('@koa/cors')(typeof config.cors === 'boolean' ? {} : config.cors));
  66. }
  67. const resolvedPlugins = [
  68. // rewrite and source map plugins take highest priority and should be run
  69. // after all other middlewares have finished
  70. serverPluginSourceMap_1.sourceMapPlugin,
  71. serverPluginModuleRewrite_1.moduleRewritePlugin,
  72. serverPluginHtml_1.htmlRewritePlugin,
  73. // user plugins
  74. ...utils_1.toArray(configureServer),
  75. serverPluginEnv_1.envPlugin,
  76. serverPluginModuleResolve_1.moduleResolvePlugin,
  77. serverPluginProxy_1.proxyPlugin,
  78. serverPluginClient_1.clientPlugin,
  79. serverPluginHmr_1.hmrPlugin,
  80. ...(transforms.length || Object.keys(vueCustomBlockTransforms).length
  81. ? [
  82. transform_1.createServerTransformPlugin(transforms, vueCustomBlockTransforms, resolver)
  83. ]
  84. : []),
  85. serverPluginVue_1.vuePlugin,
  86. serverPluginCss_1.cssPlugin,
  87. enableEsbuild ? serverPluginEsbuild_1.esbuildPlugin : null,
  88. serverPluginJson_1.jsonPlugin,
  89. serverPluginAssets_1.assetPathPlugin,
  90. serverPluginWebWorker_1.webWorkerPlugin,
  91. serverPluginWasm_1.wasmPlugin,
  92. serverPluginServeStatic_1.serveStaticPlugin
  93. ];
  94. resolvedPlugins.forEach((m) => m && m(context));
  95. const listen = server.listen.bind(server);
  96. server.listen = (async (port, ...args) => {
  97. if (optimizeDeps.auto !== false) {
  98. await require('../optimizer').optimizeDeps(config);
  99. }
  100. return listen(port, ...args);
  101. });
  102. server.once('listening', () => {
  103. context.port = server.address().port;
  104. });
  105. return server;
  106. }
  107. exports.createServer = createServer;
  108. function resolveServer({ https = false, httpsOptions = {}, proxy }, requestListener) {
  109. if (https) {
  110. if (proxy) {
  111. // #484 fallback to http1 when proxy is needed.
  112. return require('https').createServer(resolveHttpsConfig(httpsOptions), requestListener);
  113. }
  114. else {
  115. return require('http2').createSecureServer({
  116. ...resolveHttpsConfig(httpsOptions),
  117. allowHTTP1: true
  118. }, requestListener);
  119. }
  120. }
  121. else {
  122. return require('http').createServer(requestListener);
  123. }
  124. }
  125. function resolveHttpsConfig(httpsOption) {
  126. const { ca, cert, key, pfx } = httpsOption;
  127. Object.assign(httpsOption, {
  128. ca: readFileIfExists(ca),
  129. cert: readFileIfExists(cert),
  130. key: readFileIfExists(key),
  131. pfx: readFileIfExists(pfx)
  132. });
  133. if (!httpsOption.key || !httpsOption.cert) {
  134. httpsOption.cert = httpsOption.key = createCertificate_1.createCertificate();
  135. }
  136. return httpsOption;
  137. }
  138. function readFileIfExists(value) {
  139. if (value && !Buffer.isBuffer(value)) {
  140. try {
  141. return fs_extra_1.default.readFileSync(path_1.default.resolve(value));
  142. }
  143. catch (e) {
  144. return value;
  145. }
  146. }
  147. return value;
  148. }
  149. //# sourceMappingURL=index.js.map