/*! * @nuxt/core v2.15.8 (c) 2016-2021 * Released under the MIT License * Repository: https://github.com/nuxt/nuxt.js * Website: https://nuxtjs.org */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); const path = require('path'); const fs = require('fs'); const hash = require('hash-sum'); const consola = require('consola'); const utils = require('@nuxt/utils'); const lodash = require('lodash'); const Hookable = require('hable'); const config = require('@nuxt/config'); const server = require('@nuxt/server'); const fs$1 = require('fs-extra'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } const path__default = /*#__PURE__*/_interopDefaultLegacy(path); const fs__default = /*#__PURE__*/_interopDefaultLegacy(fs); const hash__default = /*#__PURE__*/_interopDefaultLegacy(hash); const consola__default = /*#__PURE__*/_interopDefaultLegacy(consola); const Hookable__default = /*#__PURE__*/_interopDefaultLegacy(Hookable); const fs__default$1 = /*#__PURE__*/_interopDefaultLegacy(fs$1); class ModuleContainer { constructor (nuxt) { this.nuxt = nuxt; this.options = nuxt.options; this.requiredModules = {}; // Self bind to allow destructre from container for (const method of Object.getOwnPropertyNames(ModuleContainer.prototype)) { if (typeof this[method] === 'function') { this[method] = this[method].bind(this); } } } async ready () { // Call before hook await this.nuxt.callHook('modules:before', this, this.options.modules); if (this.options.buildModules && !this.options._start) { // Load every devModule in sequence await utils.sequence(this.options.buildModules, this.addModule); } // Load every module in sequence await utils.sequence(this.options.modules, this.addModule); // Load ah-hoc modules last await utils.sequence(this.options._modules, this.addModule); // Call done hook await this.nuxt.callHook('modules:done', this); } addVendor () { consola__default['default'].warn('addVendor has been deprecated due to webpack4 optimization'); } addTemplate (template) { if (!template) { throw new Error('Invalid template: ' + JSON.stringify(template)) } // Validate & parse source const src = template.src || template; const srcPath = path__default['default'].parse(src); if (typeof src !== 'string' || !fs__default['default'].existsSync(src)) { throw new Error('Template src not found: ' + src) } // Mostly for DX, some people prefers `filename` vs `fileName` const fileName = template.fileName || template.filename; // Generate unique and human readable dst filename if not provided const dst = fileName || `${path__default['default'].basename(srcPath.dir)}.${srcPath.name}.${hash__default['default'](src)}${srcPath.ext}`; // Add to templates list const templateObj = { src, dst, options: template.options }; this.options.build.templates.push(templateObj); return templateObj } addPlugin (template) { const { dst } = this.addTemplate(template); // Add to nuxt plugins this.options.plugins.unshift({ src: path__default['default'].join(this.options.buildDir, dst), // TODO: remove deprecated option in Nuxt 3 ssr: template.ssr, mode: template.mode }); } addLayout (template, name) { const { dst, src } = this.addTemplate(template); const layoutName = name || path__default['default'].parse(src).name; const layout = this.options.layouts[layoutName]; if (layout) { consola__default['default'].warn(`Duplicate layout registration, "${layoutName}" has been registered as "${layout}"`); } // Add to nuxt layouts this.options.layouts[layoutName] = `./${dst}`; // If error layout, set ErrorPage if (name === 'error') { this.addErrorLayout(dst); } } addErrorLayout (dst) { const relativeBuildDir = path__default['default'].relative(this.options.rootDir, this.options.buildDir); this.options.ErrorPage = `~/${relativeBuildDir}/${dst}`; } addServerMiddleware (middleware) { this.options.serverMiddleware.push(middleware); } extendBuild (fn) { this.options.build.extend = utils.chainFn(this.options.build.extend, fn); } extendRoutes (fn) { this.options.router.extendRoutes = utils.chainFn( this.options.router.extendRoutes, fn ); } requireModule (moduleOpts, { paths } = {}) { return this.addModule(moduleOpts, undefined, { paths }) } async addModule (moduleOpts, arg2, arg3) { // Arg2 was previously used for requireOnce which is ignored now const { paths } = { ...arg2, ...arg3 }; let src; let options; let handler; // Type 1: String or Function if (typeof moduleOpts === 'string' || typeof moduleOpts === 'function') { src = moduleOpts; } else if (Array.isArray(moduleOpts)) { // Type 2: Babel style array [src, options] = moduleOpts; } else if (typeof moduleOpts === 'object') { // Type 3: Pure object ({ src, options, handler } = moduleOpts); } // Define handler if src is a function if (typeof src === 'function') { handler = src; } // Prevent adding buildModules-listed entries in production if (this.options.buildModules.includes(handler) && this.options._start) { return } // Resolve handler if (!handler) { try { handler = this.nuxt.resolver.requireModule(src, { paths }); // pnp support try { (global.__NUXT_PATHS__ || []).push(this.nuxt.resolver.resolvePath(src, { paths })); } catch (_err) {} } catch (error) { if (error.code !== 'MODULE_NOT_FOUND') { throw error } // Hint only if entrypoint is not found and src is not local alias or path if (error.message.includes(src) && !/^[~.]|^@\//.test(src)) { let message = 'Module `{name}` not found.'; if (this.options.buildModules.includes(src)) { message += ' Please ensure `{name}` is in `devDependencies` and installed. HINT: During build step, for npm/yarn, `NODE_ENV=production` or `--production` should NOT be used.'.replace('{name}', src); } else if (this.options.modules.includes(src)) { message += ' Please ensure `{name}` is in `dependencies` and installed.'; } message = message.replace(/{name}/g, src); consola__default['default'].warn(message); } if (this.options._cli) { throw error } else { // TODO: Remove in next major version consola__default['default'].warn('Silently ignoring module as programatic usage detected.'); return } } } // Validate handler if (typeof handler !== 'function') { throw new TypeError('Module should export a function: ' + src) } // Ensure module is required once const metaKey = handler.meta && handler.meta.name; const key = metaKey || src; if (typeof key === 'string') { if (this.requiredModules[key]) { if (!metaKey) { // TODO: Skip with nuxt3 consola__default['default'].warn('Modules should be only specified once:', key); } else { return } } this.requiredModules[key] = { src, options, handler }; } // Default module options to empty object if (options === undefined) { options = {}; } const result = await handler.call(this, options); return result } } var version = "2.15.8"; class Resolver { constructor (nuxt) { this.nuxt = nuxt; this.options = this.nuxt.options; // Binds this.resolvePath = this.resolvePath.bind(this); this.resolveAlias = this.resolveAlias.bind(this); this.resolveModule = this.resolveModule.bind(this); this.requireModule = this.requireModule.bind(this); this._createRequire = this.options.createRequire || utils.createRequire; this._require = this._createRequire(__filename); } resolveModule (path, { paths } = {}) { try { return this._require.resolve(path, { paths: [].concat(global.__NUXT_PREPATHS__ || [], paths || [], this.options.modulesDir, global.__NUXT_PATHS__ || [], process.cwd()) }) } catch (error) { if (error.code !== 'MODULE_NOT_FOUND') { throw error } } } resolveAlias (path$1) { if (utils.startsWithRootAlias(path$1)) { return path.join(this.options.rootDir, path$1.substr(2)) } if (utils.startsWithSrcAlias(path$1)) { return path.join(this.options.srcDir, path$1.substr(1)) } return path.resolve(this.options.srcDir, path$1) } resolvePath (path$1, { alias, isAlias = alias, module, isModule = module, isStyle, paths } = {}) { // TODO: Remove in Nuxt 3 if (alias) { consola__default['default'].warn('Using alias is deprecated and will be removed in Nuxt 3. Use `isAlias` instead.'); } if (module) { consola__default['default'].warn('Using module is deprecated and will be removed in Nuxt 3. Use `isModule` instead.'); } // Fast return in case of path exists if (fs__default$1['default'].existsSync(path$1)) { return path$1 } let resolvedPath; // Try to resolve it as a regular module if (isModule !== false) { resolvedPath = this.resolveModule(path$1, { paths }); } // Try to resolve alias if (!resolvedPath && isAlias !== false) { resolvedPath = this.resolveAlias(path$1); } // Use path for resolvedPath if (!resolvedPath) { resolvedPath = path$1; } let isDirectory; // Check if resolvedPath exits and is not a directory if (fs__default$1['default'].existsSync(resolvedPath)) { isDirectory = fs__default$1['default'].lstatSync(resolvedPath).isDirectory(); if (!isDirectory) { return resolvedPath } } const extensions = isStyle ? this.options.styleExtensions : this.options.extensions; // Check if any resolvedPath.[ext] or resolvedPath/index.[ext] exists for (const ext of extensions) { if (!isDirectory && fs__default$1['default'].existsSync(resolvedPath + '.' + ext)) { return resolvedPath + '.' + ext } const resolvedPathwithIndex = path.join(resolvedPath, 'index.' + ext); if (isDirectory && fs__default$1['default'].existsSync(resolvedPathwithIndex)) { return resolvedPathwithIndex } } // If there's no index.[ext] we just return the directory path if (isDirectory) { return resolvedPath } // Give up throw new Error(`Cannot resolve "${path$1}" from "${resolvedPath}"`) } requireModule (path, { alias, isAlias = alias, intropDefault, interopDefault = intropDefault, paths } = {}) { let resolvedPath = path; let requiredModule; // TODO: Remove in Nuxt 3 if (intropDefault) { consola__default['default'].warn('Using intropDefault is deprecated and will be removed in Nuxt 3. Use `interopDefault` instead.'); } if (alias) { consola__default['default'].warn('Using alias is deprecated and will be removed in Nuxt 3. Use `isAlias` instead.'); } let lastError; // Try to resolve path try { resolvedPath = this.resolvePath(path, { isAlias, paths }); } catch (e) { lastError = e; } const isExternal = utils.isExternalDependency(resolvedPath); // in dev mode make sure to clear the require cache so after // a dev server restart any changed file is reloaded if (this.options.dev && !isExternal) { utils.clearRequireCache(resolvedPath); } // Try to require try { requiredModule = this._require(resolvedPath); } catch (e) { lastError = e; } // Interop default if (interopDefault !== false && requiredModule && requiredModule.default) { requiredModule = requiredModule.default; } // Throw error if failed to require if (requiredModule === undefined && lastError) { throw lastError } return requiredModule } } class Nuxt extends Hookable__default['default'] { constructor (options = {}) { super(consola__default['default']); // Assign options and apply defaults this.options = config.getNuxtConfig(options); // Create instance of core components this.resolver = new Resolver(this); this.moduleContainer = new ModuleContainer(this); // Deprecated hooks this.deprecateHooks({ // #3294 - 7514db73b25c23b8c14ebdafbb4e129ac282aabd 'render:context': { to: '_render:context', message: '`render:context(nuxt)` is deprecated, Please use `vue-renderer:ssr:context(context)`' }, // #3773 'render:routeContext': { to: '_render:context', message: '`render:routeContext(nuxt)` is deprecated, Please use `vue-renderer:ssr:context(context)`' }, showReady: 'webpack:done', // Introduced in 2.13 'export:done': 'generate:done', 'export:before': 'generate:before', 'export:extendRoutes': 'generate:extendRoutes', 'export:distRemoved': 'generate:distRemoved', 'export:distCopied': 'generate:distCopied', 'export:route': 'generate:route', 'export:routeFailed': 'generate:routeFailed', 'export:page': 'generate:page', 'export:routeCreated': 'generate:routeCreated' }); // Add Legacy aliases utils.defineAlias(this, this.resolver, ['resolveAlias', 'resolvePath']); this.showReady = () => { this.callHook('webpack:done'); }; // Init server if (this.options.server !== false) { this._initServer(); } // Call ready if (this.options._ready !== false) { this.ready().catch((err) => { consola__default['default'].fatal(err); }); } } static get version () { return `v${version}` + (global.__NUXT_DEV__ ? '-development' : '') } ready () { if (!this._ready) { this._ready = this._init(); } return this._ready } async _init () { if (this._initCalled) { return this } this._initCalled = true; // Add hooks if (lodash.isPlainObject(this.options.hooks)) { this.addHooks(this.options.hooks); } else if (typeof this.options.hooks === 'function') { this.options.hooks(this.hook); } // Await for modules await this.moduleContainer.ready(); // Await for server to be ready if (this.server) { await this.server.ready(); } // Call ready hook await this.callHook('ready', this); return this } _initServer () { if (this.server) { return } this.server = new server.Server(this); this.renderer = this.server; this.render = this.server.app; utils.defineAlias(this, this.server, ['renderRoute', 'renderAndGetWindow', 'listen']); } async close (callback) { await this.callHook('close', this); if (typeof callback === 'function') { await callback(); } this.clearHooks(); } } const OVERRIDES = { dry: { dev: false, server: false }, dev: { dev: true, _build: true }, build: { dev: false, server: false, _build: true }, start: { dev: false, _start: true } }; async function loadNuxt (loadOptions) { // Normalize loadOptions if (typeof loadOptions === 'string') { loadOptions = { for: loadOptions }; } const { ready = true } = loadOptions; const _for = loadOptions.for || 'dry'; // Get overrides const override = OVERRIDES[_for]; // Unsupported purpose if (!override) { throw new Error('Unsupported for: ' + _for) } // Load Config const config$1 = await config.loadNuxtConfig(loadOptions); // Apply config overrides Object.assign(config$1, override); // Initiate Nuxt const nuxt = new Nuxt(config$1); if (ready) { await nuxt.ready(); } return nuxt } Object.defineProperty(exports, 'loadNuxtConfig', { enumerable: true, get: function () { return config.loadNuxtConfig; } }); exports.Module = ModuleContainer; exports.Nuxt = Nuxt; exports.Resolver = Resolver; exports.loadNuxt = loadNuxt;