fix(kit): don't rely on ModuleThis (#272)

This commit is contained in:
Daniel Roe 2021-06-25 10:37:18 +01:00 committed by GitHub
parent 5b8c4caecc
commit dfbb047be6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 64 additions and 91 deletions

View File

@ -1,7 +1,4 @@
import { nuxtCtx } from '../nuxt'
import type { Nuxt } from '../types/nuxt' import type { Nuxt } from '../types/nuxt'
import type { NuxtOptions } from '../types/config'
import type { TemplateOpts, PluginTemplateOpts } from '../types/module'
import { import {
addTemplate, addTemplate,
addErrorLayout, addErrorLayout,
@ -14,19 +11,10 @@ import {
import { installModule } from './install' import { installModule } from './install'
/** Legacy ModuleContainer for backwards compatibility with existing Nuxt 2 modules. */ /** Legacy ModuleContainer for backwards compatibility with existing Nuxt 2 modules. */
export class ModuleContainer { export function createModuleContainer (nuxt: Nuxt) {
nuxt: Nuxt return {
options: NuxtOptions nuxt,
options: nuxt.options,
constructor (nuxt: Nuxt) {
this.nuxt = nuxt
this.options = nuxt.options
}
private _call<F extends (...args: any) => any>(fn: F, ...args: Parameters<F>): ReturnType<F> {
// @ts-ignore
return nuxtCtx.call(this.nuxt, () => fn(...args))
}
/** /**
* Returns a resolved promise immediately. * Returns a resolved promise immediately.
@ -35,12 +23,12 @@ export class ModuleContainer {
*/ */
ready () { ready () {
return Promise.resolve() return Promise.resolve()
} },
/** @deprecated */ /** @deprecated */
addVendor () { addVendor () {
console.warn('addVendor has been deprecated and has no effect.') console.warn('addVendor has been deprecated and has no effect.')
} },
/** /**
* Renders given template using lodash template during build into the project buildDir (`.nuxt`). * Renders given template using lodash template during build into the project buildDir (`.nuxt`).
@ -48,9 +36,7 @@ export class ModuleContainer {
* If a fileName is not provided or the template is string, target file name defaults to * If a fileName is not provided or the template is string, target file name defaults to
* [dirName].[fileName].[pathHash].[ext]. * [dirName].[fileName].[pathHash].[ext].
*/ */
addTemplate (tmpl: TemplateOpts | string) { addTemplate,
return this._call(addTemplate, tmpl)
}
/** /**
* Registers a plugin using `addTemplate` and prepends it to the plugins[] array. * Registers a plugin using `addTemplate` and prepends it to the plugins[] array.
@ -70,46 +56,33 @@ export class ModuleContainer {
* }) * })
* ``` * ```
*/ */
addPlugin (tmpl: PluginTemplateOpts) { addPlugin,
return this._call(addPlugin, tmpl)
}
/** Register a custom layout. If its name is 'error' it will override the default error layout. */ /** Register a custom layout. If its name is 'error' it will override the default error layout. */
addLayout (tmpl: TemplateOpts, name: string) { addLayout,
return this._call(addLayout, tmpl, name)
}
/** /**
* Set the layout that will render Nuxt errors. It should already have been added via addLayout or addTemplate. * Set the layout that will render Nuxt errors. It should already have been added via addLayout or addTemplate.
* *
* @param dst - Path to layout file within the buildDir (`.nuxt/<dst>.vue`) * @param dst - Path to layout file within the buildDir (`.nuxt/<dst>.vue`)
*/ */
addErrorLayout (dst: string) { addErrorLayout,
return this._call(addErrorLayout, dst)
}
/** Adds a new server middleware to the end of the server middleware array. */ /** Adds a new server middleware to the end of the server middleware array. */
addServerMiddleware (middleware) { addServerMiddleware,
return this._call(addServerMiddleware, middleware)
}
/** Allows extending webpack build config by chaining `options.build.extend` function. */ /** Allows extending webpack build config by chaining `options.build.extend` function. */
extendBuild (fn) { extendBuild,
return this._call(extendBuild, fn)
}
/** Allows extending routes by chaining `options.build.extendRoutes` function. */ /** Allows extending routes by chaining `options.build.extendRoutes` function. */
extendRoutes (fn) { extendRoutes,
return this._call(extendRoutes, fn)
}
/** `requireModule` is a shortcut for `addModule` */ /** `requireModule` is a shortcut for `addModule` */
requireModule (moduleOpts: string | [src: string, options: any]) { requireModule: installModule,
return installModule(this.nuxt, moduleOpts)
}
/** Registers a module. moduleOpts can be a string or an array ([src, options]). */ /** Registers a module. moduleOpts can be a string or an array ([src, options]). */
addModule (moduleOpts: string | [src: string, options: any]) { addModule: installModule
return installModule(this.nuxt, moduleOpts)
} }
} }
export type ModuleContainer = ReturnType<typeof createModuleContainer>

View File

@ -3,7 +3,7 @@ import { resolveAlias } from '../utils/resolve'
import type { LegacyNuxtModule, NuxtModule, ModuleMeta, ModuleInstallOptions, ModuleOptions, ModuleSrc } from '../types/module' import type { LegacyNuxtModule, NuxtModule, ModuleMeta, ModuleInstallOptions, ModuleOptions, ModuleSrc } from '../types/module'
import type { Nuxt } from '../types/nuxt' import type { Nuxt } from '../types/nuxt'
import { defineNuxtModule } from './define' import { defineNuxtModule } from './define'
import { ModuleContainer } from './container' import { createModuleContainer } from './container'
/** Installs a module on a Nuxt instance. */ /** Installs a module on a Nuxt instance. */
export async function installModule (nuxt: Nuxt, installOpts: ModuleInstallOptions) { export async function installModule (nuxt: Nuxt, installOpts: ModuleInstallOptions) {
@ -57,6 +57,6 @@ export async function installModule (nuxt: Nuxt, installOpts: ModuleInstallOptio
} }
// Execute in legacy container // Execute in legacy container
const container = new ModuleContainer(nuxt) const container = createModuleContainer(nuxt)
await handler.call(container, options) await handler.call(container, options)
} }