diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e5ca91dd4d..2a6f815dc6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,8 +48,8 @@ jobs: - name: Install dependencies run: yarn --immutable - - name: Stub - run: yarn stub + - name: Build + run: yarn build - name: Test (unit) run: yarn test:unit @@ -81,8 +81,8 @@ jobs: - name: Install dependencies (bridge fixture) run: yarn --immutable && cd test/fixtures/bridge && yarn --immutable - - name: Stub - run: yarn stub + - name: Build + run: yarn build - name: Test (presets bridge) run: yarn test:bridge diff --git a/package.json b/package.json index 854438c5ba..734e54643c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "nuxt-framework", "license": "MIT", + "type": "module", "workspaces": [ "packages/*", "examples/*", diff --git a/packages/bridge/build.config.ts b/packages/bridge/build.config.ts index b44fdee12e..62d4ea5999 100644 --- a/packages/bridge/build.config.ts +++ b/packages/bridge/build.config.ts @@ -1,6 +1,7 @@ import { defineBuildConfig } from 'unbuild' export default defineBuildConfig({ + emitCJS: false, entries: [ 'src/module', { input: 'src/runtime/', outDir: 'dist/runtime', format: 'esm' } diff --git a/packages/bridge/module.cjs b/packages/bridge/module.cjs new file mode 100644 index 0000000000..4aeb7eb3b2 --- /dev/null +++ b/packages/bridge/module.cjs @@ -0,0 +1,4 @@ +// CommonJS proxy to bypass jiti transforms from nuxt 2 +module.exports = function (...args) { + return import('./dist/module.mjs').then(m => m.default.call(this, ...args)) +} diff --git a/packages/bridge/package.json b/packages/bridge/package.json index 2558ed662e..8d1eaf47f6 100644 --- a/packages/bridge/package.json +++ b/packages/bridge/package.json @@ -3,9 +3,11 @@ "version": "0.0.0", "repository": "nuxt/framework", "license": "MIT", - "main": "./dist/module.cjs", + "type": "module", + "exports": "./module.cjs", "types": "./dist/index.d.ts", "files": [ + "module.cjs", "dist" ], "scripts": { @@ -22,6 +24,7 @@ "estree-walker": "^2.0.2", "fs-extra": "^10.0.0", "magic-string": "^0.25.7", + "mlly": "^0.2.2", "node-fetch": "^3.0.0", "nuxi": "^0.10.0", "nuxt-swc": "^0.1.0", diff --git a/packages/bridge/src/async-loading.ts b/packages/bridge/src/async-loading.ts index 270a9ce1b3..2366baa6b9 100644 --- a/packages/bridge/src/async-loading.ts +++ b/packages/bridge/src/async-loading.ts @@ -1,15 +1,24 @@ // Based on https://github.com/webpack/webpack/blob/v4.46.0/lib/node/NodeMainTemplatePlugin.js#L81-L191 +import { createRequire } from 'module' import type { Compiler } from 'webpack' - export class AsyncLoadingPlugin { + private opts: any + private Template: any + constructor (opts) { + this.opts = opts + const _require = createRequire(import.meta.url) + const TemplatePath = _require.resolve('webpack/lib/Template', { paths: [...this.opts.modulesDir] }) + this.Template = _require(TemplatePath) + } + apply (compiler: Compiler) { - const Template = require('webpack/lib/Template') compiler.hooks.compilation.tap('AsyncLoading', (compilation) => { const mainTemplate = compilation.mainTemplate mainTemplate.hooks.requireEnsure.tap( 'AsyncLoading', (_source, chunk, hash) => { + const Template = this.Template const chunkFilename = mainTemplate.outputOptions.chunkFilename const chunkMaps = chunk.getChunkMaps() const insertMoreModules = [ diff --git a/packages/bridge/src/capi.ts b/packages/bridge/src/capi.ts index 00b31bc69c..5442c94dd7 100644 --- a/packages/bridge/src/capi.ts +++ b/packages/bridge/src/capi.ts @@ -1,6 +1,6 @@ +import { createRequire } from 'module' import { useNuxt, addPlugin, addPluginTemplate, addVitePlugin, addWebpackPlugin } from '@nuxt/kit' import { resolve } from 'pathe' - import { distDir } from './dirs' import { KeyPlugin } from './capi-legacy-key-plugin' @@ -13,7 +13,8 @@ export function setupCAPIBridge (_options: any) { } // Add composition-api support - const vueCapiEntry = require.resolve('@vue/composition-api/dist/vue-composition-api.mjs') + const _require = createRequire(import.meta.url) + const vueCapiEntry = _require.resolve('@vue/composition-api/dist/vue-composition-api.mjs') nuxt.options.alias['@vue/composition-api/dist/vue-composition-api.common.js'] = vueCapiEntry nuxt.options.alias['@vue/composition-api/dist/vue-composition-api.common.prod.js'] = vueCapiEntry nuxt.options.alias['@vue/composition-api/dist/vue-composition-api.esm.js'] = vueCapiEntry diff --git a/packages/bridge/src/dirs.ts b/packages/bridge/src/dirs.ts index 216d6beb10..af0ffb33a2 100644 --- a/packages/bridge/src/dirs.ts +++ b/packages/bridge/src/dirs.ts @@ -1,4 +1,5 @@ -import { resolve } from 'pathe' +import { fileURLToPath } from 'url' +import { dirname, resolve } from 'pathe' -export const distDir = __dirname +export const distDir = dirname(fileURLToPath(import.meta.url)) export const pkgDir = resolve(distDir, '..') diff --git a/packages/bridge/src/module.ts b/packages/bridge/src/module.ts index 51c9465028..5485075e3e 100644 --- a/packages/bridge/src/module.ts +++ b/packages/bridge/src/module.ts @@ -1,3 +1,4 @@ +import { createRequire } from 'module' import { defineNuxtModule, installModule } from '@nuxt/kit' import { setupNitroBridge } from './nitro' import { setupAppBridge } from './app' @@ -30,14 +31,15 @@ export default defineNuxtModule({ } await setupCAPIBridge(opts.capi) } + const _require = createRequire(import.meta.url) if (opts.vite) { - await installModule(nuxt, require.resolve('nuxt-vite')) + await installModule(nuxt, _require.resolve('nuxt-vite')) } if (opts.postcss8) { - await installModule(nuxt, require.resolve('@nuxt/postcss8')) + await installModule(nuxt, _require.resolve('@nuxt/postcss8')) } if (opts.swc) { - await installModule(nuxt, require.resolve('nuxt-swc')) + await installModule(nuxt, _require.resolve('nuxt-swc')) } if (opts.resolve) { setupBetterResolve() diff --git a/packages/bridge/src/nitro.ts b/packages/bridge/src/nitro.ts index f18846bc53..a018ea2f2f 100644 --- a/packages/bridge/src/nitro.ts +++ b/packages/bridge/src/nitro.ts @@ -1,8 +1,8 @@ +import { promises as fsp } from 'fs' import fetch from 'node-fetch' import { addPluginTemplate, useNuxt } from '@nuxt/kit' import { stringifyQuery } from 'ufo' import { resolve } from 'pathe' -import { readFile, writeFile } from 'fs-extra' import { build, generate, prepare, getNitroContext, NitroContext, createDevServer, wpfs, resolveMiddleware } from '@nuxt/nitro' import { AsyncLoadingPlugin } from './async-loading' import { distDir } from './dirs' @@ -68,7 +68,9 @@ export function setupNitroBridge () { const serverConfig = webpackConfigs.find(config => config.name === 'server') if (serverConfig) { serverConfig.plugins = serverConfig.plugins || [] - serverConfig.plugins.push(new AsyncLoadingPlugin()) + serverConfig.plugins.push(new AsyncLoadingPlugin({ + modulesDir: nuxt.options.modulesDir + })) } }) @@ -98,11 +100,11 @@ export function setupNitroBridge () { nuxt.hook('build:compiled', async ({ name }) => { if (name === 'server') { const jsServerEntry = resolve(nuxt.options.buildDir, 'dist/server/server.js') - await writeFile(jsServerEntry.replace(/.js$/, '.cjs'), 'module.exports = require("./server.js")', 'utf8') - await writeFile(jsServerEntry.replace(/.js$/, '.mjs'), 'export { default } from "./server.cjs"', 'utf8') + await fsp.writeFile(jsServerEntry.replace(/.js$/, '.cjs'), 'module.exports = require("./server.js")', 'utf8') + await fsp.writeFile(jsServerEntry.replace(/.js$/, '.mjs'), 'export { default } from "./server.cjs"', 'utf8') } else if (name === 'client') { - const manifest = await readFile(resolve(nuxt.options.buildDir, 'dist/server/client.manifest.json'), 'utf8') - await writeFile(resolve(nuxt.options.buildDir, 'dist/server/client.manifest.mjs'), 'export default ' + manifest, 'utf8') + const manifest = await fsp.readFile(resolve(nuxt.options.buildDir, 'dist/server/client.manifest.json'), 'utf8') + await fsp.writeFile(resolve(nuxt.options.buildDir, 'dist/server/client.manifest.mjs'), 'export default ' + manifest, 'utf8') } }) diff --git a/packages/bridge/src/resolve.ts b/packages/bridge/src/resolve.ts index 416dbc3283..3e0bfa82af 100644 --- a/packages/bridge/src/resolve.ts +++ b/packages/bridge/src/resolve.ts @@ -1,16 +1,15 @@ import fs from 'fs' import { promisify } from 'util' import defu from 'defu' - -import { CachedInputFileSystem, ResolveContext, ResolverFactory } from 'enhanced-resolve' +import enhancedResolve from 'enhanced-resolve' import { ResolveOptions } from 'webpack/types' import { extendWebpackConfig, useNuxt } from '@nuxt/kit' -type UserResolveOptions = Parameters[0] -type ResolverOptions = Omit & { fileSystem?: CachedInputFileSystem } +type UserResolveOptions = Parameters[0] +type ResolverOptions = Omit & { fileSystem?: enhancedResolve.CachedInputFileSystem } const DEFAULTS: UserResolveOptions = { - fileSystem: new CachedInputFileSystem(fs, 4000), + fileSystem: new enhancedResolve.CachedInputFileSystem(fs, 4000), extensions: ['.ts', '.mjs', '.cjs', '.js', '.json'], mainFields: ['module', 'main'] } @@ -18,11 +17,11 @@ const DEFAULTS: UserResolveOptions = { // Abstracted resolver factory which can be used in rollup, webpack, etc. const createResolver = (resolveOptions: ResolverOptions) => { const options = defu(resolveOptions, DEFAULTS) as UserResolveOptions - const resolver = ResolverFactory.createResolver(options) + const resolver = enhancedResolve.ResolverFactory.createResolver(options) const root = options.roots?.[0] || '.' - const promisifiedResolve = promisify(resolver.resolve.bind(resolver)) as (context: object, path: string, request: string, resolveContext: ResolveContext) => Promise + const promisifiedResolve = promisify(resolver.resolve.bind(resolver)) as (context: object, path: string, request: string, resolveContext: enhancedResolve.ResolveContext) => Promise const resolve = (id: string, importer?: string) => promisifiedResolve({}, importer || root, id, {}) diff --git a/packages/kit/build.config.ts b/packages/kit/build.config.ts index 74c2c95201..b99b113f5c 100644 --- a/packages/kit/build.config.ts +++ b/packages/kit/build.config.ts @@ -2,6 +2,7 @@ import { defineBuildConfig } from 'unbuild' export default defineBuildConfig({ declaration: true, + emitCJS: false, entries: [ { input: 'src/config/schema/index', diff --git a/packages/kit/package.json b/packages/kit/package.json index 3a998e0a75..bdde8b88f9 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -3,7 +3,8 @@ "version": "0.10.0", "repository": "nuxt/framework", "license": "MIT", - "main": "./dist/index.cjs", + "type": "module", + "exports": "./dist/index.mjs", "types": "./dist/index.d.ts", "files": [ "dist", @@ -13,7 +14,7 @@ "prepack": "unbuild" }, "devDependencies": { - "@types/lodash": "^4.14.175", + "@types/lodash.template": "^4", "unbuild": "latest" }, "dependencies": { @@ -25,7 +26,7 @@ "hash-sum": "^2.0.0", "hookable": "^5.0.0", "jiti": "^1.12.6", - "lodash": "^4.17.21", + "lodash.template": "^4.5.0", "pathe": "^0.2.0", "rc9": "^1.2.0", "scule": "^0.2.1", diff --git a/packages/kit/src/config/env.ts b/packages/kit/src/config/env.ts index f2ad896f89..1a6497cdd9 100644 --- a/packages/kit/src/config/env.ts +++ b/packages/kit/src/config/env.ts @@ -1,6 +1,6 @@ import { existsSync, promises as fsp } from 'fs' import { resolve } from 'pathe' -import dotenv from 'dotenv' +import { parse as parseDotEnv } from 'dotenv' import { LoadNuxtConfigOptions } from './load' export interface LoadDotEnvOptions { @@ -62,7 +62,7 @@ export async function loadDotenv (opts: LoadDotEnvOptions) { const dotenvFile = resolve(opts.rootDir, opts.dotenvFile) if (existsSync(dotenvFile)) { - const parsed = dotenv.parse(await fsp.readFile(dotenvFile, 'utf-8')) + const parsed = parseDotEnv(await fsp.readFile(dotenvFile, 'utf-8')) Object.assign(env, parsed) } diff --git a/packages/kit/src/config/schema/_common.ts b/packages/kit/src/config/schema/_common.ts index 7aff91a0c3..1f9982034d 100644 --- a/packages/kit/src/config/schema/_common.ts +++ b/packages/kit/src/config/schema/_common.ts @@ -627,7 +627,7 @@ export default { * @example * ```js * import fs from 'fs' - * import path from 'pathe' + * import path from 'path' * export default { * hooks: { * build: { diff --git a/packages/kit/src/module/container.ts b/packages/kit/src/module/container.ts index 3fed5b03b2..b6ae21ff2e 100644 --- a/packages/kit/src/module/container.ts +++ b/packages/kit/src/module/container.ts @@ -1,4 +1,4 @@ -import path from 'pathe' +import { parse, relative } from 'pathe' import consola from 'consola' import type { Nuxt, NuxtPluginTemplate, NuxtTemplate } from '../types/nuxt' import { chainFn } from '../utils/task' @@ -66,7 +66,7 @@ export function createModuleContainer (nuxt: Nuxt) { /** Register a custom layout. If its name is 'error' it will override the default error layout. */ addLayout (tmpl: NuxtTemplate, name: string) { const { filename, src } = addTemplate(tmpl) - const layoutName = name || path.parse(src).name + const layoutName = name || parse(src).name const layout = nuxt.options.layouts[layoutName] if (layout) { @@ -88,7 +88,7 @@ export function createModuleContainer (nuxt: Nuxt) { * @param dst - Path to layout file within the buildDir (`.nuxt/.vue`) */ addErrorLayout (dst: string) { - const relativeBuildDir = path.relative(nuxt.options.rootDir, nuxt.options.buildDir) + const relativeBuildDir = relative(nuxt.options.rootDir, nuxt.options.buildDir) nuxt.options.ErrorPage = `~/${relativeBuildDir}/${dst}` }, diff --git a/packages/kit/src/module/utils.ts b/packages/kit/src/module/utils.ts index 03fc82bd22..147abb7096 100644 --- a/packages/kit/src/module/utils.ts +++ b/packages/kit/src/module/utils.ts @@ -1,6 +1,6 @@ import { existsSync, promises as fsp } from 'fs' import { basename, extname, parse, resolve } from 'pathe' -import lodashTemplate from 'lodash/template' +import lodashTemplate from 'lodash.template' import hash from 'hash-sum' import type { WebpackPluginInstance, Configuration as WebpackConfig } from 'webpack' import type { Plugin as VitePlugin, UserConfig as ViteConfig } from 'vite' diff --git a/packages/kit/src/nuxt.ts b/packages/kit/src/nuxt.ts index 1079d11d47..e36db067eb 100644 --- a/packages/kit/src/nuxt.ts +++ b/packages/kit/src/nuxt.ts @@ -1,5 +1,5 @@ import { getContext } from 'unctx' -import { requireModule, tryRequireModule, tryResolveModule } from './utils/cjs' +import { importModule, tryImportModule, tryResolveModule } from './utils/cjs' import type { Nuxt } from './types/nuxt' import type { NuxtConfig } from './types/config' import type { LoadNuxtConfigOptions } from './config/load' @@ -50,14 +50,14 @@ export async function loadNuxt (opts: LoadNuxtOptions): Promise { // Nuxt 3 if (opts.version !== 2) { - const { loadNuxt } = requireModule('nuxt3', resolveOpts) + const { loadNuxt } = await importModule('nuxt3', resolveOpts) const nuxt = await loadNuxt(opts) return nuxt } // Nuxt 2 // @ts-ignore - const { loadNuxt } = tryRequireModule('nuxt-edge', resolveOpts) || requireModule('nuxt', resolveOpts) + const { loadNuxt } = await tryImportModule('nuxt-edge', resolveOpts) || await importModule('nuxt', resolveOpts) const nuxt = await loadNuxt({ rootDir: opts.rootDir, for: opts.dev ? 'dev' : 'build', @@ -68,17 +68,17 @@ export async function loadNuxt (opts: LoadNuxtOptions): Promise { return nuxt as Nuxt } -export function buildNuxt (nuxt: Nuxt): Promise { +export async function buildNuxt (nuxt: Nuxt): Promise { const resolveOpts = { paths: nuxt.options.rootDir } // Nuxt 3 if (nuxt.options._majorVersion === 3) { - const { build } = requireModule('nuxt3', resolveOpts) + const { build } = await importModule('nuxt3', resolveOpts) return build(nuxt) } // Nuxt 2 // @ts-ignore - const { build } = tryRequireModule('nuxt-edge', resolveOpts) || requireModule('nuxt', resolveOpts) + const { build } = tryImportModule('nuxt-edge', resolveOpts) || tryImportModule('nuxt', resolveOpts) return build(nuxt) } diff --git a/packages/kit/src/utils/cjs.ts b/packages/kit/src/utils/cjs.ts index 651cc37979..3401bdbc5d 100644 --- a/packages/kit/src/utils/cjs.ts +++ b/packages/kit/src/utils/cjs.ts @@ -1,8 +1,9 @@ +import { pathToFileURL } from 'url' import { join, normalize } from 'pathe' import jiti from 'jiti' // TODO: use create-require for jest environment -const _require = jiti(process.cwd()) +const _require = jiti(process.cwd(), { interopDefault: true }) export interface ResolveModuleOptions { paths?: string | string[] @@ -125,6 +126,15 @@ export function requireModule (id: string, opts: RequireModuleOptions = {}) { return requiredModule } +export function importModule (id: string, opts: RequireModuleOptions = {}) { + const resolvedPath = resolveModule(id, opts) + return import(pathToFileURL(resolvedPath).href) +} + +export function tryImportModule (id: string, opts: RequireModuleOptions = {}) { + return importModule(id, opts).catch(() => undefined) +} + /** Try to require a module, but don't emit an error if the module can't be required. */ export function tryRequireModule (id: string, opts: RequireModuleOptions = {}) { try { diff --git a/packages/nitro/build.config.ts b/packages/nitro/build.config.ts index 8f682d7fc7..e3760c2383 100644 --- a/packages/nitro/build.config.ts +++ b/packages/nitro/build.config.ts @@ -2,6 +2,7 @@ import { defineBuildConfig } from 'unbuild' export default defineBuildConfig({ declaration: true, + emitCJS: false, entries: [ 'src/index', { input: 'src/runtime/', outDir: 'dist/runtime', format: 'esm' }, diff --git a/packages/nitro/compat.js b/packages/nitro/compat.js deleted file mode 100644 index d3c92d80e2..0000000000 --- a/packages/nitro/compat.js +++ /dev/null @@ -1,3 +0,0 @@ -export default function () { - throw new Error('Nitro compat for nuxt2 moved to nuxt bridge. Please check documentation for more details.') -} diff --git a/packages/nitro/package.json b/packages/nitro/package.json index f9f3d2e562..b35d707285 100644 --- a/packages/nitro/package.json +++ b/packages/nitro/package.json @@ -2,12 +2,12 @@ "name": "@nuxt/nitro", "version": "0.10.0", "license": "MIT", - "main": "./dist/index.cjs", + "type": "module", + "exports": "./dist/index.mjs", "types": "./types/index.d.ts", "files": [ "dist", - "types", - "compat.js" + "types" ], "scripts": { "prepack": "unbuild" @@ -50,6 +50,7 @@ "jiti": "^1.12.6", "listhen": "^0.2.4", "mime": "^2.5.2", + "mlly": "^0.2.2", "node-fetch": "^3.0.0", "ohmyfetch": "^0.3.1", "ora": "^6.0.1", @@ -65,7 +66,6 @@ "ufo": "^0.7.9", "unenv": "^0.3.10", "unstorage": "^0.2.8", - "upath": "^2.0.1", "vue": "3.2.19", "vue-bundle-renderer": "^0.3.1", "vue-server-renderer": "^2.6.14" diff --git a/packages/nitro/src/build.ts b/packages/nitro/src/build.ts index e3e8b9237e..f4dc5aba4e 100644 --- a/packages/nitro/src/build.ts +++ b/packages/nitro/src/build.ts @@ -1,7 +1,7 @@ import { resolve, join } from 'pathe' import consola from 'consola' import { rollup, watch as rollupWatch } from 'rollup' -import { readFile, emptyDir, copy } from 'fs-extra' +import fse from 'fs-extra' import { printFSTree } from './utils/tree' import { getRollupConfig } from './rollup/config' import { hl, prettyPath, serializeTemplate, writeFile, isDirectory } from './utils' @@ -24,7 +24,7 @@ export async function prepare (nitroContext: NitroContext) { async function cleanupDir (dir: string) { consola.info('Cleaning up', prettyPath(dir)) - await emptyDir(dir) + await fse.emptyDir(dir) } export async function generate (nitroContext: NitroContext) { @@ -32,12 +32,12 @@ export async function generate (nitroContext: NitroContext) { const clientDist = resolve(nitroContext._nuxt.buildDir, 'dist/client') if (await isDirectory(clientDist)) { - await copy(clientDist, join(nitroContext.output.publicDir, nitroContext._nuxt.publicPath)) + await fse.copy(clientDist, join(nitroContext.output.publicDir, nitroContext._nuxt.publicPath)) } const publicDir = nitroContext._nuxt.publicDir if (await isDirectory(publicDir)) { - await copy(publicDir, nitroContext.output.publicDir) + await fse.copy(publicDir, nitroContext.output.publicDir) } consola.success('Generated public ' + prettyPath(nitroContext.output.publicDir)) @@ -48,7 +48,7 @@ export async function build (nitroContext: NitroContext) { const htmlSrc = resolve(nitroContext._nuxt.buildDir, `views/${{ 2: 'app', 3: 'document' }[2]}.template.html`) const htmlTemplate = { src: htmlSrc, contents: '', dst: '', compiled: '' } htmlTemplate.dst = htmlTemplate.src.replace(/.html$/, '.mjs').replace('app.', 'document.') - htmlTemplate.contents = nitroContext.vfs[htmlTemplate.src] || await readFile(htmlTemplate.src, 'utf-8') + htmlTemplate.contents = nitroContext.vfs[htmlTemplate.src] || await fse.readFile(htmlTemplate.src, 'utf-8') await nitroContext._internal.hooks.callHook('nitro:document', htmlTemplate) htmlTemplate.compiled = 'export default ' + serializeTemplate(htmlTemplate.contents) await writeFile(htmlTemplate.dst, htmlTemplate.compiled) diff --git a/packages/nitro/src/context.ts b/packages/nitro/src/context.ts index 0b0372b84a..047b128153 100644 --- a/packages/nitro/src/context.ts +++ b/packages/nitro/src/context.ts @@ -1,6 +1,5 @@ /* eslint-disable no-use-before-define */ - -import { resolve, dirname } from 'pathe' +import { resolve } from 'pathe' import defu from 'defu' import { createHooks, Hookable, NestedHooks } from 'hookable' import type { Preset } from 'unenv' @@ -13,6 +12,7 @@ import type { AssetOptions } from './rollup/plugins/assets' import type { ServerMiddleware } from './server/middleware' import type { RollupConfig } from './rollup/config' import type { Options as EsbuildOptions } from './rollup/plugins/esbuild' +import { runtimeDir } from './dirs' export interface NitroHooks { 'nitro:document': (htmlTemplate: { src: string, contents: string, dst: string, compiled: string }) => void @@ -136,7 +136,7 @@ export function getNitroContext (nuxtOptions: NuxtOptions, input: NitroInput): N } }, _internal: { - runtimeDir: resolve(dirname(require.resolve('@nuxt/nitro')), 'runtime'), + runtimeDir, hooks: createHooks() } } diff --git a/packages/nitro/src/dirs.ts b/packages/nitro/src/dirs.ts new file mode 100644 index 0000000000..bf63260976 --- /dev/null +++ b/packages/nitro/src/dirs.ts @@ -0,0 +1,6 @@ +import { fileURLToPath } from 'url' +import { dirname, resolve } from 'pathe' + +export const distDir = dirname(fileURLToPath(import.meta.url)) +export const pkgDir = resolve(distDir, '..') +export const runtimeDir = resolve(distDir, 'runtime') diff --git a/packages/nitro/src/presets/azure_functions.ts b/packages/nitro/src/presets/azure_functions.ts index 07d274a85e..a1c8df208e 100644 --- a/packages/nitro/src/presets/azure_functions.ts +++ b/packages/nitro/src/presets/azure_functions.ts @@ -1,6 +1,6 @@ +import { createWriteStream } from 'fs' import archiver from 'archiver' import consola from 'consola' -import { createWriteStream } from 'fs-extra' import { join, resolve } from 'pathe' import { prettyPath, writeFile } from '../utils' import { NitroPreset, NitroContext } from '../context' diff --git a/packages/nitro/src/presets/browser.ts b/packages/nitro/src/presets/browser.ts index 084bd13acf..f174c9e792 100644 --- a/packages/nitro/src/presets/browser.ts +++ b/packages/nitro/src/presets/browser.ts @@ -1,4 +1,4 @@ -import { existsSync, writeFile } from 'fs-extra' +import { existsSync, promises as fsp } from 'fs' import { resolve } from 'pathe' import consola from 'consola' import { extendPreset, prettyPath } from '../utils' @@ -62,17 +62,17 @@ if ('serviceWorker' in navigator) { tmpl.compiled = tmpl.compiled.replace('', script + '') }, async 'nitro:compiled' ({ output }: NitroContext) { - await writeFile(resolve(output.publicDir, 'sw.js'), `self.importScripts('${input._nuxt.routerBase}_server/index.mjs');`) + await fsp.writeFile(resolve(output.publicDir, 'sw.js'), `self.importScripts('${input._nuxt.routerBase}_server/index.mjs');`, 'utf8') // Temp fix if (!existsSync(resolve(output.publicDir, 'index.html'))) { - await writeFile(resolve(output.publicDir, 'index.html'), html) + await fsp.writeFile(resolve(output.publicDir, 'index.html'), html, 'utf8') } if (!existsSync(resolve(output.publicDir, '200.html'))) { - await writeFile(resolve(output.publicDir, '200.html'), html) + await fsp.writeFile(resolve(output.publicDir, '200.html'), html, 'utf8') } if (!existsSync(resolve(output.publicDir, '404.html'))) { - await writeFile(resolve(output.publicDir, '404.html'), html) + await fsp.writeFile(resolve(output.publicDir, '404.html'), html, 'utf8') } consola.info('Ready to deploy to static hosting:', prettyPath(output.publicDir as string)) } diff --git a/packages/nitro/src/presets/firebase.ts b/packages/nitro/src/presets/firebase.ts index bcceb3b7e6..25d5aaf4bd 100644 --- a/packages/nitro/src/presets/firebase.ts +++ b/packages/nitro/src/presets/firebase.ts @@ -1,5 +1,6 @@ +import { createRequire } from 'module' import { join, relative, resolve } from 'pathe' -import { existsSync, readJSONSync } from 'fs-extra' +import fse from 'fs-extra' import consola from 'consola' import globby from 'globby' @@ -16,7 +17,7 @@ export const firebase: NitroPreset = { } async function writeRoutes ({ output: { publicDir, serverDir }, _nuxt: { rootDir } }: NitroContext) { - if (!existsSync(join(rootDir, 'firebase.json'))) { + if (!fse.existsSync(join(rootDir, 'firebase.json'))) { const firebase = { functions: { source: relative(rootDir, serverDir) @@ -38,20 +39,22 @@ async function writeRoutes ({ output: { publicDir, serverDir }, _nuxt: { rootDir await writeFile(resolve(rootDir, 'firebase.json'), JSON.stringify(firebase)) } + const _require = createRequire(import.meta.url) + const jsons = await globby(`${serverDir}/node_modules/**/package.json`) const prefixLength = `${serverDir}/node_modules/`.length const suffixLength = '/package.json'.length const dependencies = jsons.reduce((obj, packageJson) => { const dirname = packageJson.slice(prefixLength, -suffixLength) if (!dirname.includes('node_modules')) { - obj[dirname] = require(packageJson).version + obj[dirname] = _require(packageJson).version } return obj }, {} as Record) let nodeVersion = '12' try { - const currentNodeVersion = readJSONSync(join(rootDir, 'package.json')).engines.node + const currentNodeVersion = fse.readJSONSync(join(rootDir, 'package.json')).engines.node if (['12', '10'].includes(currentNodeVersion)) { nodeVersion = currentNodeVersion } @@ -66,8 +69,8 @@ async function writeRoutes ({ output: { publicDir, serverDir }, _nuxt: { rootDir dependencies, devDependencies: { 'firebase-functions-test': 'latest', - 'firebase-admin': require('firebase-admin/package.json').version, - 'firebase-functions': require('firebase-functions/package.json') + 'firebase-admin': _require('firebase-admin/package.json').version, + 'firebase-functions': _require('firebase-functions/package.json') .version }, engines: { node: nodeVersion } diff --git a/packages/nitro/src/presets/netlify.ts b/packages/nitro/src/presets/netlify.ts index 0e308d7c8c..0e4059b7d5 100644 --- a/packages/nitro/src/presets/netlify.ts +++ b/packages/nitro/src/presets/netlify.ts @@ -1,5 +1,5 @@ +import { existsSync, promises as fsp } from 'fs' import { join } from 'pathe' -import { existsSync, readFile, writeFile } from 'fs-extra' import consola from 'consola' import { extendPreset } from '../utils' import { NitroContext, NitroPreset } from '../context' @@ -15,7 +15,7 @@ export const netlify: NitroPreset = extendPreset(lambda, { const redirectsPath = join(ctx.output.publicDir, '_redirects') let contents = '/* /.netlify/functions/server 200' if (existsSync(redirectsPath)) { - const currentRedirects = await readFile(redirectsPath, 'utf-8') + const currentRedirects = await fsp.readFile(redirectsPath, 'utf-8') if (currentRedirects.match(/^\/\* /m)) { consola.info('Not adding Nitro fallback to `_redirects` (as an existing fallback was found).') return @@ -23,7 +23,7 @@ export const netlify: NitroPreset = extendPreset(lambda, { consola.info('Adding Nitro fallback to `_redirects` to handle all unmatched routes.') contents = currentRedirects + '\n' + contents } - await writeFile(redirectsPath, contents) + await fsp.writeFile(redirectsPath, contents) }, 'nitro:rollup:before' (ctx: NitroContext) { ctx.rollupConfig.output.entryFileNames = 'server.ts' diff --git a/packages/nitro/src/rollup/config.ts b/packages/nitro/src/rollup/config.ts index 9e654fd87a..ab774f0464 100644 --- a/packages/nitro/src/rollup/config.ts +++ b/packages/nitro/src/rollup/config.ts @@ -1,5 +1,6 @@ import { pathToFileURL } from 'url' -import { dirname, join, normalize, relative, resolve } from 'pathe' +import { createRequire } from 'module' +import { dirname, join, relative, resolve } from 'pathe' import type { InputOptions, OutputOptions } from 'rollup' import defu from 'defu' import { terser } from 'rollup-plugin-terser' @@ -15,7 +16,8 @@ import * as unenv from 'unenv' import type { Preset } from 'unenv' import { NitroContext } from '../context' -import { resolvePath, MODULE_DIR } from '../utils' +import { resolvePath } from '../utils' +import { pkgDir } from '../dirs' import { dynamicRequire } from './plugins/dynamic-require' import { externals } from './plugins/externals' @@ -63,10 +65,11 @@ export const getRollupConfig = (nitroContext: NitroContext) => { } // TODO: #590 + const _require = createRequire(import.meta.url) if (nitroContext._nuxt.majorVersion === 3) { env.alias['vue/server-renderer'] = 'vue/server-renderer' env.alias['vue/compiler-sfc'] = 'vue/compiler-sfc' - env.alias.vue = require.resolve(`vue/dist/vue.cjs${nitroContext._nuxt.dev ? '' : '.prod'}.js`) + env.alias.vue = _require.resolve(`vue/dist/vue.cjs${nitroContext._nuxt.dev ? '' : '.prod'}.js`) } const buildServerDir = join(nitroContext._nuxt.buildDir, 'dist/server') @@ -216,8 +219,8 @@ export const getRollupConfig = (nitroContext: NitroContext) => { rollupConfig.plugins.push(alias({ entries: { '#nitro': nitroContext._internal.runtimeDir, - '#nitro-renderer': normalize(require.resolve(resolve(nitroContext._internal.runtimeDir, 'app', renderer))), - '#config': normalize(require.resolve(resolve(nitroContext._internal.runtimeDir, 'app/config'))), + '#nitro-renderer': resolve(nitroContext._internal.runtimeDir, 'app', renderer), + '#config': resolve(nitroContext._internal.runtimeDir, 'app/config'), '#nitro-vue-renderer': vue2ServerRenderer, // Only file and data URLs are supported by the default ESM loader on Windows (#427) '#build': nitroContext._nuxt.dev && process.platform === 'win32' @@ -234,7 +237,7 @@ export const getRollupConfig = (nitroContext: NitroContext) => { const moduleDirectories = [ resolve(nitroContext._nuxt.rootDir, 'node_modules'), ...nitroContext._nuxt.modulesDir, - resolve(MODULE_DIR, '../node_modules'), + resolve(pkgDir, '../node_modules'), 'node_modules' ] diff --git a/packages/nitro/src/rollup/plugins/dynamic-require.ts b/packages/nitro/src/rollup/plugins/dynamic-require.ts index fa7951d096..35a5376cc0 100644 --- a/packages/nitro/src/rollup/plugins/dynamic-require.ts +++ b/packages/nitro/src/rollup/plugins/dynamic-require.ts @@ -1,10 +1,11 @@ +import { pathToFileURL } from 'url' import { resolve } from 'pathe' import globby from 'globby' import type { Plugin } from 'rollup' import { serializeImportName } from '../../utils' const PLUGIN_NAME = 'dynamic-require' -const HELPER_DYNAMIC = `\0${PLUGIN_NAME}.js` +const HELPER_DYNAMIC = `\0${PLUGIN_NAME}.mjs` const DYNAMIC_REQUIRE_RE = /import\("\.\/" ?\+(.*)\).then/g interface Options { @@ -57,24 +58,25 @@ export function dynamicRequire ({ dir, ignore, inline }: Options): Plugin { let files = [] try { const wpManifest = resolve(dir, './server.manifest.json') - files = await import(wpManifest).then(r => Object.keys(r.files).filter(file => !ignore.includes(file))) + files = await import(pathToFileURL(wpManifest).href).then(r => Object.keys(r.files).filter(file => !ignore.includes(file))) } catch { files = await globby('**/*.{cjs,mjs,js}', { cwd: dir, absolute: false, ignore }) } - const chunks = files.map(id => ({ + + const chunks = (await Promise.all(files.map(async id => ({ id, src: resolve(dir, id).replace(/\\/g, '/'), name: serializeImportName(id), - meta: getWebpackChunkMeta(resolve(dir, id)) - })).filter(chunk => chunk.meta) + meta: await getWebpackChunkMeta(resolve(dir, id)) + })))).filter(chunk => chunk.meta) return inline ? TMPL_INLINE({ chunks }) : TMPL_LAZY({ chunks }) } } } -function getWebpackChunkMeta (src: string) { - const chunk = require(src) || {} +async function getWebpackChunkMeta (src: string) { + const chunk = await import(pathToFileURL(src).href).then(r => r.default || r || {}) const { id, ids, modules } = chunk if (!id && !ids) { return null // Not a webpack chunk diff --git a/packages/nitro/src/rollup/plugins/externals.ts b/packages/nitro/src/rollup/plugins/externals.ts index 3210dd1155..3855a51b3a 100644 --- a/packages/nitro/src/rollup/plugins/externals.ts +++ b/packages/nitro/src/rollup/plugins/externals.ts @@ -1,5 +1,5 @@ import { resolve, dirname } from 'pathe' -import { copyFile, mkdirp } from 'fs-extra' +import fse from 'fs-extra' import { nodeFileTrace, NodeFileTraceOptions } from '@vercel/nft' import type { Plugin } from 'rollup' @@ -84,8 +84,8 @@ export function externals (opts: NodeExternalsOptions): Plugin { const writeFile = async (file) => { const src = resolve(opts.traceOptions.base, file) const dst = resolve(opts.outDir, 'node_modules', file.split('node_modules/').pop()) - await mkdirp(dirname(dst)) - await copyFile(src, dst) + await fse.mkdirp(dirname(dst)) + await fse.copyFile(src, dst) } if (process.platform === 'win32') { // Workaround for EBUSY on windows (#424) diff --git a/packages/nitro/src/rollup/plugins/static.ts b/packages/nitro/src/rollup/plugins/static.ts index c259833b45..e4f9ccd4ca 100644 --- a/packages/nitro/src/rollup/plugins/static.ts +++ b/packages/nitro/src/rollup/plugins/static.ts @@ -1,5 +1,5 @@ +import { readFileSync, statSync } from 'fs' import createEtag from 'etag' -import { readFileSync, statSync } from 'fs-extra' import mime from 'mime' import { relative, resolve } from 'pathe' import virtual from '@rollup/plugin-virtual' diff --git a/packages/nitro/src/rollup/plugins/virtual.ts b/packages/nitro/src/rollup/plugins/virtual.ts index bc919e8cb6..cd1c8ee0a8 100644 --- a/packages/nitro/src/rollup/plugins/virtual.ts +++ b/packages/nitro/src/rollup/plugins/virtual.ts @@ -1,4 +1,4 @@ -import * as path from 'pathe' +import { resolve, dirname } from 'pathe' import type { Plugin } from 'rollup' // Based on https://github.com/rollup/plugins/blob/master/packages/virtual/src/index.ts @@ -16,7 +16,7 @@ export default function virtual (modules: RollupVirtualOptions): Plugin { for (const [id, mod] of Object.entries(modules)) { _modules.set(id, mod) - _modules.set(path.resolve(id), mod) + _modules.set(resolve(id), mod) } return { @@ -29,7 +29,7 @@ export default function virtual (modules: RollupVirtualOptions): Plugin { const importerNoPrefix = importer.startsWith(PREFIX) ? importer.slice(PREFIX.length) : importer - const resolved = path.resolve(path.dirname(importerNoPrefix), id) + const resolved = resolve(dirname(importerNoPrefix), id) if (_modules.has(resolved)) { return PREFIX + resolved } } diff --git a/packages/nitro/src/runtime/entries/firebase.ts b/packages/nitro/src/runtime/entries/firebase.ts index 162fa04071..b8dfd55c34 100644 --- a/packages/nitro/src/runtime/entries/firebase.ts +++ b/packages/nitro/src/runtime/entries/firebase.ts @@ -1,7 +1,7 @@ import '#polyfill' +// @ts-ignore +import functions from 'firebase-functions' import { handle } from '../server' -const functions = require('firebase-functions') - export const server = functions.https.onRequest(handle) diff --git a/packages/nitro/src/server/dev.ts b/packages/nitro/src/server/dev.ts index 3e261c1b37..3beed262d4 100644 --- a/packages/nitro/src/server/dev.ts +++ b/packages/nitro/src/server/dev.ts @@ -1,17 +1,17 @@ import { Worker } from 'worker_threads' import { IncomingMessage, ServerResponse } from 'http' +import { promises as fsp } from 'fs' import { loading as loadingTemplate } from '@nuxt/design' import chokidar, { FSWatcher } from 'chokidar' import debounce from 'debounce' -import { stat } from 'fs-extra' import { promisifyHandle, createApp, Middleware, useBase } from 'h3' -import { createProxy } from 'http-proxy' +import httpProxy from 'http-proxy' import { listen, Listener, ListenOptions } from 'listhen' import servePlaceholder from 'serve-placeholder' import serveStatic from 'serve-static' import { resolve } from 'pathe' -import type { Server } from 'connect' +import connect from 'connect' import type { NitroContext } from '../context' import { handleVfs } from './vfs' @@ -27,7 +27,7 @@ export function createDevServer (nitroContext: NitroContext) { workerAddress = null pendingWorker = null } - if (!(await stat(workerEntry)).isFile) { + if (!(await fsp.stat(workerEntry)).isFile) { throw new Error('Entry not found: ' + workerEntry) } return new Promise((resolve, reject) => { @@ -72,7 +72,7 @@ export function createDevServer (nitroContext: NitroContext) { app.use(nitroContext._nuxt.publicPath, servePlaceholder()) // SSR Proxy - const proxy = createProxy() + const proxy = httpProxy.createProxy() const proxyHandle = promisifyHandle((req: IncomingMessage, res: ServerResponse) => proxy.web(req, res, { target: workerAddress }, (_err: unknown) => { // console.error('[proxy]', err) })) @@ -151,7 +151,7 @@ function createDynamicMiddleware (): DynamicMiddleware { middleware = input return } - const app: Server = require('connect')() + const app = connect() for (const m of input) { app.use(m.path || m.route || '/', m.handler || m.handle!) } diff --git a/packages/nitro/src/utils/index.ts b/packages/nitro/src/utils/index.ts index 22dacb264a..997f363e66 100644 --- a/packages/nitro/src/utils/index.ts +++ b/packages/nitro/src/utils/index.ts @@ -1,3 +1,4 @@ +import { createRequire } from 'module' import { relative, dirname, resolve } from 'pathe' import fse from 'fs-extra' import jiti from 'jiti' @@ -8,8 +9,6 @@ import chalk from 'chalk' import { get } from 'dot-prop' import type { NitroPreset, NitroInput } from '../context' -export const MODULE_DIR = resolve(__dirname, '..') - export function hl (str: string) { return chalk.cyan(str) } @@ -35,7 +34,7 @@ export function serializeTemplate (contents: string) { } export function jitiImport (dir: string, path: string) { - return jiti(dir)(path) + return jiti(dir, { interopDefault: true })(path) } export function tryImport (dir: string, path: string) { @@ -107,9 +106,10 @@ const _getDependenciesMode = { prod: ['dependencies'], all: ['devDependencies', 'dependencies'] } +const _require = createRequire(import.meta.url) export function getDependencies (dir: string, mode: keyof typeof _getDependenciesMode = 'all') { const fields = _getDependenciesMode[mode] - const pkg = require(resolve(dir, 'package.json')) + const pkg = _require(resolve(dir, 'package.json')) const dependencies = [] for (const field of fields) { if (pkg[field]) { diff --git a/packages/nitro/src/utils/tree.ts b/packages/nitro/src/utils/tree.ts index 175569beb6..72ba7e4fb0 100644 --- a/packages/nitro/src/utils/tree.ts +++ b/packages/nitro/src/utils/tree.ts @@ -1,8 +1,8 @@ +import { promises as fsp } from 'fs' import { resolve, dirname, relative } from 'pathe' import globby from 'globby' import prettyBytes from 'pretty-bytes' import gzipSize from 'gzip-size' -import { readFile } from 'fs-extra' import chalk from 'chalk' import stdenv from 'std-env' @@ -15,7 +15,7 @@ export async function printFSTree (dir: string) { const items = (await Promise.all(files.map(async (file) => { const path = resolve(dir, file) - const src = await readFile(path) + const src = await fsp.readFile(path) const size = src.byteLength const gzip = await gzipSize(src) return { file, path, size, gzip } diff --git a/packages/nuxi/bin/nuxi.cjs b/packages/nuxi/bin/nuxi.cjs deleted file mode 100755 index aed07f34ea..0000000000 --- a/packages/nuxi/bin/nuxi.cjs +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env node -process._startTime = Date.now() - -require('../dist/index.cjs').main() diff --git a/packages/nuxi/bin/nuxi.mjs b/packages/nuxi/bin/nuxi.mjs new file mode 100755 index 0000000000..fb1e6760d5 --- /dev/null +++ b/packages/nuxi/bin/nuxi.mjs @@ -0,0 +1,3 @@ +#!/usr/bin/env node +process._startTime = Date.now() +import('../dist/index.mjs').then(r => (r.default || r).main()) diff --git a/packages/nuxi/build.config.ts b/packages/nuxi/build.config.ts index a47eba0d6b..9f690f29cd 100644 --- a/packages/nuxi/build.config.ts +++ b/packages/nuxi/build.config.ts @@ -3,6 +3,8 @@ import { defineBuildConfig } from 'unbuild' export default defineBuildConfig({ declaration: true, inlineDependencies: true, + emitCJS: false, + cjsBridge: true, entries: [ 'src/index' ], diff --git a/packages/nuxi/package.json b/packages/nuxi/package.json index f0037e4881..fb55bec3d0 100644 --- a/packages/nuxi/package.json +++ b/packages/nuxi/package.json @@ -3,10 +3,14 @@ "version": "0.10.0", "repository": "nuxt/framework", "license": "MIT", - "main": "./dist/index.cjs", + "type": "module", + "exports": { + ".": "./dist/index.mjs", + "./cli": "./bin/nuxi.mjs" + }, "bin": { - "nu": "./bin/nuxi.cjs", - "nuxi": "./bin/nuxi.cjs" + "nu": "./bin/nuxi.mjs", + "nuxi": "./bin/nuxi.mjs" }, "scripts": { "prepack": "unbuild" @@ -34,6 +38,7 @@ "flat": "^5.0.2", "jiti": "^1.12.6", "listhen": "^0.2.4", + "mlly": "^0.2.2", "mri": "^1.2.0", "pathe": "^0.2.0", "scule": "^0.2.1", diff --git a/packages/nuxi/src/commands/build.ts b/packages/nuxi/src/commands/build.ts index 63e150b5a1..9e7a83aeb8 100644 --- a/packages/nuxi/src/commands/build.ts +++ b/packages/nuxi/src/commands/build.ts @@ -1,5 +1,5 @@ import { resolve } from 'pathe' -import { requireModule } from '../utils/cjs' +import { importModule } from '../utils/cjs' import { error } from '../utils/log' import { defineNuxtCommand } from './index' @@ -14,7 +14,7 @@ export default defineNuxtCommand({ process.env.NODE_ENV = process.env.NODE_ENV || 'production' const rootDir = resolve(args._[0] || '.') - const { loadNuxt, buildNuxt } = requireModule('@nuxt/kit', rootDir) as typeof import('@nuxt/kit') + const { loadNuxt, buildNuxt } = await importModule('@nuxt/kit', rootDir) as typeof import('@nuxt/kit') const nuxt = await loadNuxt({ rootDir }) diff --git a/packages/nuxi/src/commands/dev.ts b/packages/nuxi/src/commands/dev.ts index 9678921696..88309b126d 100644 --- a/packages/nuxi/src/commands/dev.ts +++ b/packages/nuxi/src/commands/dev.ts @@ -4,7 +4,7 @@ import debounce from 'debounce-promise' import type { Nuxt } from '@nuxt/kit' import { createServer, createLoadingHandler } from '../utils/server' import { showBanner } from '../utils/banner' -import { requireModule } from '../utils/cjs' +import { importModule } from '../utils/cjs' import { error } from '../utils/log' import { defineNuxtCommand } from './index' @@ -24,7 +24,7 @@ export default defineNuxtCommand({ const rootDir = resolve(args._[0] || '.') - const { loadNuxt, buildNuxt } = requireModule('@nuxt/kit', rootDir) as typeof import('@nuxt/kit') + const { loadNuxt, buildNuxt } = await importModule('@nuxt/kit', rootDir) as typeof import('@nuxt/kit') let currentNuxt: Nuxt const load = async (isRestart: boolean, reason?: string) => { diff --git a/packages/nuxi/src/commands/index.ts b/packages/nuxi/src/commands/index.ts index 408771f3fa..621653c745 100644 --- a/packages/nuxi/src/commands/index.ts +++ b/packages/nuxi/src/commands/index.ts @@ -1,11 +1,13 @@ import type { Argv } from 'mri' +const _rDefault = r => r.default || r + export const commands = { - dev: () => import('./dev'), - build: () => import('./build'), - prepare: () => import('./prepare'), - usage: () => import('./usage'), - info: () => import('./info') + dev: () => import('./dev').then(_rDefault), + build: () => import('./build').then(_rDefault), + prepare: () => import('./prepare').then(_rDefault), + usage: () => import('./usage').then(_rDefault), + info: () => import('./info').then(_rDefault) } export type Command = keyof typeof commands diff --git a/packages/nuxi/src/commands/info.ts b/packages/nuxi/src/commands/info.ts index 4eb1142532..7cb2bb686b 100644 --- a/packages/nuxi/src/commands/info.ts +++ b/packages/nuxi/src/commands/info.ts @@ -1,5 +1,6 @@ import os from 'os' import { existsSync, readFileSync } from 'fs' +import { createRequire } from 'module' import { resolve, dirname } from 'pathe' import jiti from 'jiti' import destr from 'destr' @@ -129,7 +130,8 @@ function getPkg (name, rootDir) { let pkgPath = resolve(rootDir, 'node_modules', name, 'package.json') // Try to resolve for more accuracy - try { pkgPath = require.resolve(name + '/package.json', { paths: [rootDir] }) } catch (_err) { + const _require = createRequire(rootDir) + try { pkgPath = _require.resolve(name + '/package.json') } catch (_err) { // console.log('not found:', name) } diff --git a/packages/nuxi/src/commands/prepare.ts b/packages/nuxi/src/commands/prepare.ts index 60884c1eea..60cc4d7b9e 100644 --- a/packages/nuxi/src/commands/prepare.ts +++ b/packages/nuxi/src/commands/prepare.ts @@ -2,7 +2,7 @@ import { promises as fsp } from 'fs' import { relative, resolve } from 'pathe' import { cyan } from 'colorette' import type { TSReference } from '@nuxt/kit' -import { requireModule, getModulePaths, getNearestPackage } from '../utils/cjs' +import { importModule, getModulePaths, getNearestPackage } from '../utils/cjs' import { success } from '../utils/log' import { defineNuxtCommand } from './index' @@ -16,7 +16,7 @@ export default defineNuxtCommand({ process.env.NODE_ENV = process.env.NODE_ENV || 'production' const rootDir = resolve(args._[0] || '.') - const { loadNuxt } = requireModule('@nuxt/kit', rootDir) as typeof import('@nuxt/kit') + const { loadNuxt } = await importModule('@nuxt/kit', rootDir) as typeof import('@nuxt/kit') const nuxt = await loadNuxt({ rootDir }) const adHocModules = nuxt.options._majorVersion === 3 diff --git a/packages/nuxi/src/index.ts b/packages/nuxi/src/index.ts index 8751176fec..fc9e52a1c1 100755 --- a/packages/nuxi/src/index.ts +++ b/packages/nuxi/src/index.ts @@ -1,4 +1,3 @@ -import 'v8-compile-cache' import mri from 'mri' import { red, cyan } from 'colorette' import { commands, Command, NuxtCommand } from './commands' @@ -30,7 +29,7 @@ async function _main () { try { // @ts-ignore default.default is hotfix for #621 - const cmd = await commands[command as Command]().then(c => c.default.default) as NuxtCommand + const cmd = await commands[command as Command]() as NuxtCommand if (args.h || args.help) { showHelp(cmd.meta) } else { diff --git a/packages/nuxi/src/utils/cjs.ts b/packages/nuxi/src/utils/cjs.ts index 2f32e1f944..c6a0331a56 100644 --- a/packages/nuxi/src/utils/cjs.ts +++ b/packages/nuxi/src/utils/cjs.ts @@ -1,3 +1,5 @@ +import { createRequire } from 'module' +import { pathToFileURL } from 'url' import { normalize, dirname } from 'pathe' export function getModulePaths (paths?: string | string[]): string[] { @@ -11,8 +13,10 @@ export function getModulePaths (paths?: string | string[]): string[] { ).filter(Boolean) } +const _require = createRequire(process.cwd()) + export function resolveModule (id: string, paths?: string | string[]) { - return normalize(require.resolve(id, { paths: getModulePaths(paths) })) + return normalize(_require.resolve(id, { paths: getModulePaths(paths) })) } export function tryResolveModule (id: string, paths?: string | string[]) { @@ -22,7 +26,12 @@ export function tryResolveModule (id: string, paths?: string | string[]) { } export function requireModule (id: string, paths?: string | string[]) { - return require(resolveModule(id, paths)) + return _require(resolveModule(id, paths)) +} + +export function importModule (id: string, paths?: string | string[]) { + const resolvedPath = resolveModule(id, paths) + return import(pathToFileURL(resolvedPath).href) } export function getNearestPackage (id: string, paths?: string | string[]) { diff --git a/packages/nuxt3/bin/nuxt.cjs b/packages/nuxt3/bin/nuxt.cjs deleted file mode 100755 index d5ceb75321..0000000000 --- a/packages/nuxt3/bin/nuxt.cjs +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -require('nuxi/bin/nuxi.cjs') diff --git a/packages/nuxt3/bin/nuxt.mjs b/packages/nuxt3/bin/nuxt.mjs new file mode 100755 index 0000000000..7faab34846 --- /dev/null +++ b/packages/nuxt3/bin/nuxt.mjs @@ -0,0 +1,2 @@ +#!/usr/bin/env node +import 'nuxi/cli' diff --git a/packages/nuxt3/build.config.ts b/packages/nuxt3/build.config.ts index c09f310e3e..fc1e91e4cd 100644 --- a/packages/nuxt3/build.config.ts +++ b/packages/nuxt3/build.config.ts @@ -2,6 +2,7 @@ import { defineBuildConfig, BuildEntry } from 'unbuild' export default defineBuildConfig({ declaration: true, + emitCJS: false, entries: [ // Core { input: 'src/index' }, diff --git a/packages/nuxt3/package.json b/packages/nuxt3/package.json index 57aa74728c..1d78c5f128 100644 --- a/packages/nuxt3/package.json +++ b/packages/nuxt3/package.json @@ -3,10 +3,11 @@ "version": "0.10.0", "repository": "nuxt/framework", "license": "MIT", - "main": "./dist/index.cjs", + "type": "module", + "exports": "./dist/index.mjs", "types": "./types.d.ts", "bin": { - "nuxt": "./bin/nuxt.cjs" + "nuxt": "./bin/nuxt.mjs" }, "files": [ "bin", @@ -32,6 +33,7 @@ "hash-sum": "^2.0.0", "hookable": "^5.0.0", "ignore": "^5.1.8", + "mlly": "^0.2.2", "nuxi": "^0.10.0", "ohmyfetch": "^0.3.1", "pathe": "^0.2.0", diff --git a/packages/nuxt3/src/core/app.ts b/packages/nuxt3/src/core/app.ts index eef3c73632..2a027f369d 100644 --- a/packages/nuxt3/src/core/app.ts +++ b/packages/nuxt3/src/core/app.ts @@ -1,7 +1,7 @@ +import { promises as fsp } from 'fs' import { resolve } from 'pathe' import defu from 'defu' import { tryResolvePath, resolveFiles, Nuxt, NuxtApp, normalizePlugin, normalizeTemplate, compileTemplate, templateUtils } from '@nuxt/kit' -import { writeFile } from 'fs-extra' import * as defaultTemplates from '../app/templates' @@ -44,7 +44,7 @@ export async function generateApp (nuxt: Nuxt, app: NuxtApp) { } if (template.write) { - await writeFile(fullPath, contents, 'utf8') + await fsp.writeFile(fullPath, contents, 'utf8') } })) diff --git a/packages/nuxt3/src/core/builder.ts b/packages/nuxt3/src/core/builder.ts index 3e11fee626..bf37985a3f 100644 --- a/packages/nuxt3/src/core/builder.ts +++ b/packages/nuxt3/src/core/builder.ts @@ -1,11 +1,11 @@ import chokidar from 'chokidar' import { Nuxt } from '@nuxt/kit' -import { emptyDir } from 'fs-extra' +import fse from 'fs-extra' import { createApp, generateApp } from './app' export async function build (nuxt: Nuxt) { // Clear buildDir once - await emptyDir(nuxt.options.buildDir) + await fse.emptyDir(nuxt.options.buildDir) const app = createApp(nuxt) await generateApp(nuxt, app) diff --git a/packages/nuxt3/src/core/nitro.ts b/packages/nuxt3/src/core/nitro.ts index 6b2aca2341..2b87a53b21 100644 --- a/packages/nuxt3/src/core/nitro.ts +++ b/packages/nuxt3/src/core/nitro.ts @@ -1,4 +1,4 @@ -import { normalize } from 'pathe' +import { resolve } from 'pathe' import { wpfs, getNitroContext, createDevServer, resolveMiddleware, build, prepare, generate } from '@nuxt/nitro' import type { Nuxt } from '@nuxt/kit' @@ -28,7 +28,7 @@ export function initNitro (nuxt: Nuxt) { // Add nitro client plugin (to inject $fetch helper) nuxt.hook('app:resolve', (app) => { - app.plugins.push({ src: normalize(require.resolve('@nuxt/nitro/dist/runtime/app/nitro.client.mjs')) }) + app.plugins.push({ src: resolve(nitroContext._internal.runtimeDir, 'app/nitro.client.mjs') }) }) // Expose process.env.NITRO_PRESET diff --git a/packages/nuxt3/src/dirs.ts b/packages/nuxt3/src/dirs.ts index 216d6beb10..af0ffb33a2 100644 --- a/packages/nuxt3/src/dirs.ts +++ b/packages/nuxt3/src/dirs.ts @@ -1,4 +1,5 @@ -import { resolve } from 'pathe' +import { fileURLToPath } from 'url' +import { dirname, resolve } from 'pathe' -export const distDir = __dirname +export const distDir = dirname(fileURLToPath(import.meta.url)) export const pkgDir = resolve(distDir, '..') diff --git a/packages/vite/build.config.ts b/packages/vite/build.config.ts index fc4a797649..ca0526a86f 100644 --- a/packages/vite/build.config.ts +++ b/packages/vite/build.config.ts @@ -2,6 +2,7 @@ import { defineBuildConfig } from 'unbuild' export default defineBuildConfig({ declaration: true, + emitCJS: false, entries: [ 'src/index' ], diff --git a/packages/vite/package.json b/packages/vite/package.json index 4495fd577f..2c525abd89 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -3,8 +3,9 @@ "version": "0.10.0", "repository": "nuxt/framework", "license": "MIT", - "main": "./dist/index.cjs", + "type": "module", "types": "./dist/index.d.ts", + "exports": "./dist/index.mjs", "files": [ "dist" ], diff --git a/packages/vite/src/client.ts b/packages/vite/src/client.ts index e65beb5f0e..acd9f32042 100644 --- a/packages/vite/src/client.ts +++ b/packages/vite/src/client.ts @@ -1,6 +1,6 @@ -import * as vite from 'vite' import { resolve } from 'pathe' -import { mkdirp, readJSON, writeFile } from 'fs-extra' +import * as vite from 'vite' +import fse from 'fs-extra' import consola from 'consola' import vitePlugin from '@vitejs/plugin-vue' @@ -84,9 +84,9 @@ export async function buildClient (ctx: ViteBuildContext) { const clientManifest = ctx.nuxt.options.dev ? devClientManifest - : await readJSON(resolve(clientDist, 'manifest.json')) + : await fse.readJSON(resolve(clientDist, 'manifest.json')) - await mkdirp(serverDist) - await writeFile(resolve(serverDist, 'client.manifest.json'), JSON.stringify(clientManifest, null, 2), 'utf8') - await writeFile(resolve(serverDist, 'client.manifest.mjs'), 'export default ' + JSON.stringify(clientManifest, null, 2), 'utf8') + await fse.mkdirp(serverDist) + await fse.writeFile(resolve(serverDist, 'client.manifest.json'), JSON.stringify(clientManifest, null, 2), 'utf8') + await fse.writeFile(resolve(serverDist, 'client.manifest.mjs'), 'export default ' + JSON.stringify(clientManifest, null, 2), 'utf8') } diff --git a/packages/vite/src/utils/wpfs.ts b/packages/vite/src/utils/wpfs.ts index 13cdb650f4..b6d0c91593 100644 --- a/packages/vite/src/utils/wpfs.ts +++ b/packages/vite/src/utils/wpfs.ts @@ -1,7 +1,7 @@ import { join } from 'pathe' -import fsExtra from 'fs-extra' +import fse from 'fs-extra' export const wpfs = { - ...fsExtra, + ...fse, join } diff --git a/packages/webpack/build.config.ts b/packages/webpack/build.config.ts index bf77753e35..43e46ca9e1 100644 --- a/packages/webpack/build.config.ts +++ b/packages/webpack/build.config.ts @@ -2,6 +2,7 @@ import { defineBuildConfig } from 'unbuild' export default defineBuildConfig({ declaration: true, + emitCJS: false, entries: [ 'src/index' ], diff --git a/packages/webpack/package.json b/packages/webpack/package.json index 0365af5e69..7ede12f096 100644 --- a/packages/webpack/package.json +++ b/packages/webpack/package.json @@ -3,8 +3,12 @@ "version": "0.10.0", "repository": "nuxt/framework", "license": "MIT", - "main": "./dist/index.cjs", + "type": "module", "types": "./dist/index.d.ts", + "exports": { + ".": "./dist/index.mjs", + "./dist/*": "./dist/*" + }, "files": [ "dist" ], @@ -27,9 +31,10 @@ "fs-extra": "^10.0.0", "glob": "^7.2.0", "hash-sum": "^2.0.0", - "lodash": "^4.17.21", + "lodash-es": "^4.17.21", "memfs": "^3.3.0", "mini-css-extract-plugin": "^2.3.0", + "mlly": "^0.2.2", "pathe": "^0.2.0", "pify": "^5.0.0", "postcss": "^8.3.8", diff --git a/packages/webpack/src/configs/client.ts b/packages/webpack/src/configs/client.ts index 58c89b9df1..834ac2365c 100644 --- a/packages/webpack/src/configs/client.ts +++ b/packages/webpack/src/configs/client.ts @@ -1,5 +1,5 @@ import querystring from 'querystring' -import path from 'pathe' +import { resolve } from 'pathe' import webpack from 'webpack' import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer' @@ -81,7 +81,7 @@ function clientPlugins (ctx: WebpackConfigContext) { // Webpack Bundle Analyzer // https://github.com/webpack-contrib/webpack-bundle-analyzer if (!ctx.isDev && options.build.analyze) { - const statsDir = path.resolve(options.buildDir, 'stats') + const statsDir = resolve(options.buildDir, 'stats') // @ts-ignore config.plugins.push(new BundleAnalyzerPlugin({ @@ -89,8 +89,8 @@ function clientPlugins (ctx: WebpackConfigContext) { defaultSizes: 'gzip', generateStatsFile: true, openAnalyzer: !options.build.quiet, - reportFilename: path.resolve(statsDir, `${ctx.name}.html`), - statsFilename: path.resolve(statsDir, `${ctx.name}.json`), + reportFilename: resolve(statsDir, `${ctx.name}.html`), + statsFilename: resolve(statsDir, `${ctx.name}.json`), ...options.build.analyze as any })) } diff --git a/packages/webpack/src/configs/server.ts b/packages/webpack/src/configs/server.ts index 8997c2a5a2..c6ad24b976 100644 --- a/packages/webpack/src/configs/server.ts +++ b/packages/webpack/src/configs/server.ts @@ -1,5 +1,5 @@ import { isAbsolute } from 'pathe' -import { ProvidePlugin } from 'webpack' +import webpack from 'webpack' import { WebpackConfigContext, applyPresets, getWebpackConfig } from '../utils/config' import { nuxt } from '../presets/nuxt' import { node } from '../presets/node' @@ -68,7 +68,7 @@ function serverPlugins (ctx: WebpackConfigContext) { // Server polyfills if (options.build.serverURLPolyfill) { - config.plugins.push(new ProvidePlugin({ + config.plugins.push(new webpack.ProvidePlugin({ URL: [options.build.serverURLPolyfill, 'URL'], URLSearchParams: [options.build.serverURLPolyfill, 'URLSearchParams'] })) diff --git a/packages/webpack/src/plugins/vue/client.ts b/packages/webpack/src/plugins/vue/client.ts index 43cf1d6aff..c200b891df 100644 --- a/packages/webpack/src/plugins/vue/client.ts +++ b/packages/webpack/src/plugins/vue/client.ts @@ -5,8 +5,8 @@ import { dirname } from 'pathe' import hash from 'hash-sum' -import { uniq } from 'lodash' -import { writeFile, mkdirp } from 'fs-extra' +import { uniq } from 'lodash-es' +import fse from 'fs-extra' import { isJS, isCSS, isHotUpdate } from './util' @@ -111,11 +111,11 @@ export default class VueSSRClientPlugin { const src = JSON.stringify(manifest, null, 2) - await mkdirp(dirname(this.options.filename)) - await writeFile(this.options.filename, src) + await fse.mkdirp(dirname(this.options.filename)) + await fse.writeFile(this.options.filename, src) const mjsSrc = 'export default ' + src - await writeFile(this.options.filename.replace('.json', '.mjs'), mjsSrc) + await fse.writeFile(this.options.filename.replace('.json', '.mjs'), mjsSrc) // assets[this.options.filename] = { // source: () => src, diff --git a/packages/webpack/src/plugins/vue/server.ts b/packages/webpack/src/plugins/vue/server.ts index 1ef59f5a96..e9bd1ee311 100644 --- a/packages/webpack/src/plugins/vue/server.ts +++ b/packages/webpack/src/plugins/vue/server.ts @@ -1,5 +1,5 @@ -import { Compilation } from 'webpack' +import webpack from 'webpack' import { validate, isJS, extractQueryPartJS } from './util' export default class VueSSRServerPlugin { @@ -18,7 +18,7 @@ export default class VueSSRServerPlugin { compiler.hooks.make.tap('VueSSRServerPlugin', (compilation: any) => { compilation.hooks.processAssets.tapAsync({ name: 'VueSSRServerPlugin', - stage: Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL + stage: webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL }, (assets, cb) => { const stats = compilation.getStats().toJson() const [entryName] = Object.keys(stats.entrypoints) diff --git a/packages/webpack/src/plugins/warning-ignore.ts b/packages/webpack/src/plugins/warning-ignore.ts index d111997a78..ac48316443 100644 --- a/packages/webpack/src/plugins/warning-ignore.ts +++ b/packages/webpack/src/plugins/warning-ignore.ts @@ -1,4 +1,4 @@ -import { WebpackError } from 'webpack' +import type { WebpackError } from 'webpack' export default class WarningIgnorePlugin { filter: (warn: WebpackError) => boolean diff --git a/packages/webpack/src/presets/babel.ts b/packages/webpack/src/presets/babel.ts index b0604c4faa..bd1a1d28f9 100644 --- a/packages/webpack/src/presets/babel.ts +++ b/packages/webpack/src/presets/babel.ts @@ -1,13 +1,16 @@ +import { createRequire } from 'module' import { normalize } from 'pathe' import TerserWebpackPlugin from 'terser-webpack-plugin' import { reservedVueTags } from '../utils/reserved-tags' import { WebpackConfigContext } from '../utils/config' +const _require = createRequire(import.meta.url) + export function babel (ctx: WebpackConfigContext) { const { config, options } = ctx const babelLoader = { - loader: normalize(require.resolve('babel-loader')), + loader: normalize(_require.resolve('babel-loader')), options: getBabelOptions(ctx) } @@ -67,7 +70,7 @@ function getBabelOptions (ctx: WebpackConfigContext) { babelOptions.plugins = babelOptions.plugins(ctx) } - const defaultPreset = [normalize(require.resolve('../../babel-preset-app')), {}] + const defaultPreset = [normalize(_require.resolve('../../babel-preset-app')), {}] if (typeof babelOptions.presets === 'function') { babelOptions.presets = babelOptions.presets(ctx, defaultPreset) diff --git a/packages/webpack/src/presets/base.ts b/packages/webpack/src/presets/base.ts index 7ea9f998d4..76457d23d2 100644 --- a/packages/webpack/src/presets/base.ts +++ b/packages/webpack/src/presets/base.ts @@ -2,9 +2,9 @@ import { resolve, normalize } from 'pathe' import TimeFixPlugin from 'time-fix-plugin' import WebpackBar from 'webpackbar' import consola from 'consola' -import { DefinePlugin, Configuration } from 'webpack' +import webpack from 'webpack' import FriendlyErrorsWebpackPlugin from '@nuxt/friendly-errors-webpack-plugin' -import { escapeRegExp } from 'lodash' +import { escapeRegExp } from 'lodash-es' import { hasProtocol, joinURL } from 'ufo' import WarningIgnorePlugin from '../plugins/warning-ignore' import { WebpackConfigContext, applyPresets, fileName } from '../utils/config' @@ -55,7 +55,7 @@ function basePlugins (ctx: WebpackConfigContext) { config.plugins.push(new WarningIgnorePlugin(getWarningIgnoreFilter(ctx))) // Provide env via DefinePlugin - config.plugins.push(new DefinePlugin(getEnv(ctx))) + config.plugins.push(new webpack.DefinePlugin(getEnv(ctx))) // Friendly errors if ( @@ -164,7 +164,7 @@ export function baseTranspile (ctx: WebpackConfigContext) { ctx.transpile = [...transpile, ...ctx.transpile] } -function getCache (ctx: WebpackConfigContext): Configuration['cache'] { +function getCache (ctx: WebpackConfigContext): webpack.Configuration['cache'] { const { options } = ctx if (!options.dev) { @@ -187,7 +187,7 @@ function getCache (ctx: WebpackConfigContext): Configuration['cache'] { // } } -function getOutput (ctx: WebpackConfigContext): Configuration['output'] { +function getOutput (ctx: WebpackConfigContext): webpack.Configuration['output'] { const { options } = ctx return { diff --git a/packages/webpack/src/presets/style.ts b/packages/webpack/src/presets/style.ts index 0b8afbf080..5c340d89ab 100644 --- a/packages/webpack/src/presets/style.ts +++ b/packages/webpack/src/presets/style.ts @@ -1,4 +1,4 @@ -import path from 'pathe' +import { resolve } from 'pathe' import MiniCssExtractPlugin from 'mini-css-extract-plugin' import CssMinimizerPlugin from 'css-minimizer-webpack-plugin' import { fileName, WebpackConfigContext, applyPresets } from '../utils/config' @@ -130,7 +130,7 @@ function createStyleResourcesLoaderRule (styleLang, styleResources, rootDir) { return { loader: 'style-resources-loader', options: { - patterns: Array.from(styleResources[styleLang]).map(p => path.resolve(rootDir, p as string)), + patterns: Array.from(styleResources[styleLang]).map(p => resolve(rootDir, p as string)), ...styleResources.options } } diff --git a/packages/webpack/src/presets/vue.ts b/packages/webpack/src/presets/vue.ts index b0bd32d155..7355ca8f44 100644 --- a/packages/webpack/src/presets/vue.ts +++ b/packages/webpack/src/presets/vue.ts @@ -1,6 +1,6 @@ import { resolve } from 'pathe' -import VueLoaderPlugin from 'vue-loader/dist/pluginWebpack5' -import { DefinePlugin } from 'webpack' +import VueLoaderPlugin from 'vue-loader/dist/pluginWebpack5.js' +import webpack from 'webpack' import VueSSRClientPlugin from '../plugins/vue/client' import VueSSRServerPlugin from '../plugins/vue/server' import { WebpackConfigContext } from '../utils/config' @@ -8,7 +8,8 @@ import { WebpackConfigContext } from '../utils/config' export function vue (ctx: WebpackConfigContext) { const { options, config } = ctx - config.plugins.push(new VueLoaderPlugin()) + // @ts-ignore + config.plugins.push(new (VueLoaderPlugin.default || VueLoaderPlugin)()) config.module.rules.push({ test: /\.vue$/i, @@ -29,7 +30,7 @@ export function vue (ctx: WebpackConfigContext) { // Feature flags // https://github.com/vuejs/vue-next/tree/master/packages/vue#bundler-build-feature-flags // TODO: Provide options to toggle - config.plugins.push(new DefinePlugin({ + config.plugins.push(new webpack.DefinePlugin({ __VUE_OPTIONS_API__: 'true', __VUE_PROD_DEVTOOLS__: 'false' })) diff --git a/packages/webpack/src/utils/babel-preset.js b/packages/webpack/src/utils/babel-preset.cjs similarity index 100% rename from packages/webpack/src/utils/babel-preset.js rename to packages/webpack/src/utils/babel-preset.cjs diff --git a/packages/webpack/src/utils/config.ts b/packages/webpack/src/utils/config.ts index 3777537333..62dd1367c9 100644 --- a/packages/webpack/src/utils/config.ts +++ b/packages/webpack/src/utils/config.ts @@ -1,6 +1,6 @@ import consola from 'consola' -import { cloneDeep } from 'lodash' -import { Configuration } from 'webpack' +import { cloneDeep } from 'lodash-es' +import type { Configuration } from 'webpack' import type { Nuxt } from '@nuxt/kit' export interface WebpackConfigContext extends ReturnType{ } diff --git a/packages/webpack/src/utils/mfs.ts b/packages/webpack/src/utils/mfs.ts index 4852480456..af07fddd9c 100644 --- a/packages/webpack/src/utils/mfs.ts +++ b/packages/webpack/src/utils/mfs.ts @@ -1,4 +1,4 @@ -import path from 'pathe' +import { join } from 'pathe' import pify from 'pify' import { Volume, createFsFromVolume } from 'memfs' @@ -13,7 +13,7 @@ export function createMFS () { // fs.join method is (still) expected by webpack-dev-middleware // There might be differences with https://github.com/webpack/memory-fs/blob/master/lib/join.js - _fs.join = path.join + _fs.join = join // Used by vue-renderer _fs.exists = p => Promise.resolve(_fs.existsSync(p)) diff --git a/packages/webpack/src/utils/postcss.ts b/packages/webpack/src/utils/postcss.ts index 25f22915e8..d40b3a0251 100644 --- a/packages/webpack/src/utils/postcss.ts +++ b/packages/webpack/src/utils/postcss.ts @@ -1,7 +1,8 @@ import fs from 'fs' -import path from 'pathe' +import { resolve } from 'pathe' import consola from 'consola' -import { defaults, merge, cloneDeep } from 'lodash' +import { createCommonJS } from 'mlly' +import { defaults, merge, cloneDeep } from 'lodash-es' import createResolver from 'postcss-import-resolver' import { Nuxt, requireModule } from '@nuxt/kit' @@ -111,7 +112,7 @@ export class PostcssConfig { '.postcssrc.json', '.postcssrc.yaml' ]) { - const configFile = path.resolve(dir, file) + const configFile = resolve(dir, file) if (fs.existsSync(configFile)) { postcssConfigFileWarning() return configFile @@ -140,8 +141,9 @@ export class PostcssConfig { loadPlugins (config) { if (!isPureObject(config.plugins)) { return } // Map postcss plugins into instances on object mode once + const cjs = createCommonJS(import.meta.url) config.plugins = this.sortPlugins(config).map((pluginName) => { - const pluginFn = requireModule(pluginName, { paths: [__dirname] }) + const pluginFn = requireModule(pluginName, { paths: [cjs.__dirname] }) const pluginOptions = config.plugins[pluginName] if (!pluginOptions || typeof pluginFn !== 'function') { return null } return pluginFn(pluginOptions) diff --git a/packages/webpack/src/webpack.ts b/packages/webpack/src/webpack.ts index 048be95bbe..fd012779f9 100644 --- a/packages/webpack/src/webpack.ts +++ b/packages/webpack/src/webpack.ts @@ -1,5 +1,5 @@ import type { IncomingMessage, ServerResponse } from 'http' -import path from 'pathe' +import { resolve } from 'pathe' import pify from 'pify' import webpack from 'webpack' import Glob from 'glob' @@ -100,7 +100,7 @@ class WebpackBundler { ) for (const ext of Object.keys(styleResources)) { await Promise.all(Array.from(styleResources[ext]).map(async (p) => { - const styleResourceFiles = await glob(path.resolve(this.nuxt.options.rootDir, p as string)) + const styleResourceFiles = await glob(resolve(this.nuxt.options.rootDir, p as string)) if (!styleResourceFiles || styleResourceFiles.length === 0) { throw new Error(`Style Resource not found: ${p}`) diff --git a/test/fixtures/bridge/nuxt.config.ts b/test/fixtures/bridge/nuxt.config.ts index e661e111d9..11b1c51a20 100644 --- a/test/fixtures/bridge/nuxt.config.ts +++ b/test/fixtures/bridge/nuxt.config.ts @@ -1,9 +1,7 @@ -import { defineNuxtConfig } from '@nuxt/kit' - // @ts-ignore global.__NUXT_PREPATHS__ = (global.__NUXT_PREPATHS__ || []).concat(__dirname) -export default defineNuxtConfig({ +export default { components: true, buildModules: [ '@nuxt/bridge' @@ -21,4 +19,4 @@ export default defineNuxtConfig({ nitro: { output: { dir: process.env.NITRO_OUTPUT_DIR } } -}) +} diff --git a/test/fixtures/bridge/yarn.lock b/test/fixtures/bridge/yarn.lock index f9ea187ffc..21492312f3 100644 --- a/test/fixtures/bridge/yarn.lock +++ b/test/fixtures/bridge/yarn.lock @@ -1690,9 +1690,9 @@ __metadata: linkType: hard "@polka/url@npm:^1.0.0-next.20": - version: 1.0.0-next.20 - resolution: "@polka/url@npm:1.0.0-next.20" - checksum: a37138ed3314606c7a8984368e29413e29b24f0b877588c161ccc5464daaa235a03bc62ebffe51063a9917f5542afb29c8181b877579b33570ec6d9304c42d2e + version: 1.0.0-next.21 + resolution: "@polka/url@npm:1.0.0-next.21" + checksum: c7654046d38984257dd639eab3dc770d1b0340916097b2fac03ce5d23506ada684e05574a69b255c32ea6a144a957c8cd84264159b545fca031c772289d88788 languageName: node linkType: hard @@ -1718,9 +1718,9 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 16.9.4 - resolution: "@types/node@npm:16.9.4" - checksum: ae281eec8e0ead86fd5fd76f56312db85dce27d0ac086d07bc917df98e16af792adc4f26dab099698509e2c3704cbd17224ec8138e822d569e3cadfc15569a71 + version: 16.10.2 + resolution: "@types/node@npm:16.10.2" + checksum: 83c1c3c68e7500103908c3f16094e458879c840a719c15b6ea577f81fe1f24a1b3473bb6c8e8091fe79a82543ca7639c6b1088fcf80292ec091d1d1c9504a87e languageName: node linkType: hard @@ -2218,11 +2218,11 @@ __metadata: linkType: hard "ansi-align@npm:^3.0.0": - version: 3.0.0 - resolution: "ansi-align@npm:3.0.0" + version: 3.0.1 + resolution: "ansi-align@npm:3.0.1" dependencies: - string-width: ^3.0.0 - checksum: 6bc5f3712d28a899063845a15c5da75b2f350dda8ffac6098581619b80a85d249cdd23c3dc7b596cd31e44477382bcdedff47e31201eaa10bb9708c9fce45330 + string-width: ^4.1.0 + checksum: 6abfa08f2141d231c257162b15292467081fa49a208593e055c866aa0455b57f3a86b5a678c190c618faa79b4c59e254493099cb700dd9cf2293c6be2c8f5d8d languageName: node linkType: hard @@ -2258,14 +2258,7 @@ __metadata: languageName: node linkType: hard -"ansi-regex@npm:^4.1.0": - version: 4.1.0 - resolution: "ansi-regex@npm:4.1.0" - checksum: 97aa4659538d53e5e441f5ef2949a3cffcb838e57aeaad42c4194e9d7ddb37246a6526c4ca85d3940a9d1e19b11cc2e114530b54c9d700c8baf163c31779baf8 - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.0": +"ansi-regex@npm:^5.0.1": version: 5.0.1 resolution: "ansi-regex@npm:5.0.1" checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b @@ -2438,19 +2431,19 @@ __metadata: linkType: hard "autoprefixer@npm:^9.6.1": - version: 9.8.6 - resolution: "autoprefixer@npm:9.8.6" + version: 9.8.7 + resolution: "autoprefixer@npm:9.8.7" dependencies: browserslist: ^4.12.0 caniuse-lite: ^1.0.30001109 - colorette: ^1.2.1 + nanocolors: ^0.2.8 normalize-range: ^0.1.2 num2fraction: ^1.2.2 postcss: ^7.0.32 postcss-value-parser: ^4.1.0 bin: autoprefixer: bin/autoprefixer - checksum: 46987bc3de6612f0276c3643061901e33cc5721d07aaeb6f0daf237554448884a59c0b17087bf0f00a07d940abcb5a6eaf2203b962c24fe33d52f76aa845cb70 + checksum: d9c6cb1ee3497f6f9346e0ea8619a8bc85844cd7ec6a86dcd6e9f8d29eed2b1a7c80135852af53b2380fb8347cc5b080ea77c294faae707e799e7b9025a40e70 languageName: node linkType: hard @@ -2492,14 +2485,14 @@ __metadata: linkType: hard "babel-plugin-polyfill-corejs3@npm:^0.2.2": - version: 0.2.4 - resolution: "babel-plugin-polyfill-corejs3@npm:0.2.4" + version: 0.2.5 + resolution: "babel-plugin-polyfill-corejs3@npm:0.2.5" dependencies: "@babel/helper-define-polyfill-provider": ^0.2.2 - core-js-compat: ^3.14.0 + core-js-compat: ^3.16.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 49e9b1709fd76bff8b577da38548d05ec0317acaa9cba893bf447af7b0f26494d635b70814452782d079b2b6f25c09dd8fa76e151c0e4ae1397e8295af14e685 + checksum: 7d464001f6cecc6b85aef71307e3ef17980b15aae4b2ae75d38a3fc3166005f6354932f9c694566970a3fb428f8fbc44f94c46e055a5a85b7fe8820ca16f85b6 languageName: node linkType: hard @@ -2734,18 +2727,18 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.12.0, browserslist@npm:^4.16.6, browserslist@npm:^4.17.0, browserslist@npm:^4.6.4": - version: 4.17.0 - resolution: "browserslist@npm:4.17.0" +"browserslist@npm:^4.0.0, browserslist@npm:^4.12.0, browserslist@npm:^4.16.6, browserslist@npm:^4.17.1, browserslist@npm:^4.6.4": + version: 4.17.2 + resolution: "browserslist@npm:4.17.2" dependencies: - caniuse-lite: ^1.0.30001254 - colorette: ^1.3.0 - electron-to-chromium: ^1.3.830 + caniuse-lite: ^1.0.30001261 + electron-to-chromium: ^1.3.854 escalade: ^3.1.1 - node-releases: ^1.1.75 + nanocolors: ^0.2.12 + node-releases: ^1.1.76 bin: browserslist: cli.js - checksum: 9b45ec283d7ba1513bd8be6143dadb34a65e8be7f7210b3a2bce947e019184408df6126238e54f8061e9be74362b19d04eaba739b3ee0d5d41d57ac0ae5fe4cd + checksum: 9102023e8a8f541110c2905854d8398245811dfa6a02c3c94a0862c402f11fd42900cd595cb8494e5ee1104120b40e4721108219931bdbb4c59855f138e684da languageName: node linkType: hard @@ -2968,10 +2961,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30000981, caniuse-lite@npm:^1.0.30001109, caniuse-lite@npm:^1.0.30001228, caniuse-lite@npm:^1.0.30001254": - version: 1.0.30001258 - resolution: "caniuse-lite@npm:1.0.30001258" - checksum: 2e87875a7792444f18060f836dbe1a3fcf58dcdd4608c63725dac503aadd617c2bb771c766963fb31528c10fd55201a7cf3ece555a3e754f94ee4a991626c302 +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30000981, caniuse-lite@npm:^1.0.30001109, caniuse-lite@npm:^1.0.30001228, caniuse-lite@npm:^1.0.30001261": + version: 1.0.30001263 + resolution: "caniuse-lite@npm:1.0.30001263" + checksum: 0657b995276a35aaa9ff6900b6e9d3876ef049c8d6065fe9f162cc0b9ac00d8b9c6e6740e87def73876a522dce8e9124170334c157cfbf5c383b7c6db79e520e languageName: node linkType: hard @@ -3079,7 +3072,7 @@ __metadata: languageName: node linkType: hard -"ci-info@npm:^3.0.0, ci-info@npm:^3.1.1": +"ci-info@npm:^3.1.1": version: 3.2.0 resolution: "ci-info@npm:3.2.0" checksum: c68995a94e95ce3f233ff845e62dfc56f2e8ff1e3f5c1361bcdd520cbbc9726d8a54cbc1a685cb9ee19c3c5e71a1dade6dda23eb364b59b8e6c32508a9b761bc @@ -3227,7 +3220,7 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^1.2.1, colorette@npm:^1.2.2, colorette@npm:^1.3.0": +"colorette@npm:^1.2.2": version: 1.4.0 resolution: "colorette@npm:1.4.0" checksum: 01c3c16058b182a4ab4c126a65a75faa4d38a20fa7c845090b25453acec6c371bb2c5dceb0a2338511f17902b9d1a9af0cadd8509c9403894b79311032c256c3 @@ -3398,13 +3391,13 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.12.1, core-js-compat@npm:^3.14.0, core-js-compat@npm:^3.16.0": - version: 3.18.0 - resolution: "core-js-compat@npm:3.18.0" +"core-js-compat@npm:^3.12.1, core-js-compat@npm:^3.16.0, core-js-compat@npm:^3.16.2": + version: 3.18.1 + resolution: "core-js-compat@npm:3.18.1" dependencies: - browserslist: ^4.17.0 + browserslist: ^4.17.1 semver: 7.0.0 - checksum: 2bf11676215d912c099078564bbbd837ff6b4a18635661414f3d72b4b78bee883117d583645629999407f910be311624d0380aefec69b3b77ef91001bcb30b19 + checksum: d7afbd879fa1fd6bd20778308bfafc8b4993b13a4c24cb0793baad4b027d13f59fef78b867137b0a570df708ea2d0766a067d8c5b3dc4e5e4747d70dc91e1c98 languageName: node linkType: hard @@ -3416,9 +3409,9 @@ __metadata: linkType: hard "core-js@npm:^3": - version: 3.18.0 - resolution: "core-js@npm:3.18.0" - checksum: 192c345eb0c8b9d582ebed798cf124e00cd8241303c3c801987563f8ebb8cb991e2ff91494c258752014c29d5515070d2c0a862687401c7d7e1e2f96f8980d42 + version: 3.18.1 + resolution: "core-js@npm:3.18.1" + checksum: 89cac0fe657df722d10b0e658ee76af12a614c0a75fe3fb11e87c2e3f27f6d7e609e3bf40748da5d8feb055b0535766a583ff1d1ac89dba57105f6f1ad64dc21 languageName: node linkType: hard @@ -4096,10 +4089,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.3.830": - version: 1.3.843 - resolution: "electron-to-chromium@npm:1.3.843" - checksum: 4adb18cf1c0f3ee8014fe6976c3e9a2c5f05353a9fd9712cf95a578ede66cd3d85106a764b6d0291c81ca31edcd8f5da4a2f7606858a11e31e410c1e6ea3f303 +"electron-to-chromium@npm:^1.3.854": + version: 1.3.857 + resolution: "electron-to-chromium@npm:1.3.857" + checksum: 59d3dcf7ec7d3c8209647cadb6cc9d2a14b9ef9cb2ae7c9837c9dbe38301838e6629bfa002121d3dc4c00e982327d6337d6d5460902f02f8a80d0d81c63f1728 languageName: node linkType: hard @@ -4118,13 +4111,6 @@ __metadata: languageName: node linkType: hard -"emoji-regex@npm:^7.0.1": - version: 7.0.3 - resolution: "emoji-regex@npm:7.0.3" - checksum: 9159b2228b1511f2870ac5920f394c7e041715429a68459ebe531601555f11ea782a8e1718f969df2711d38c66268174407cbca57ce36485544f695c2dfdc96e - languageName: node - linkType: hard - "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" @@ -4226,8 +4212,8 @@ __metadata: linkType: hard "es-abstract@npm:^1.17.2, es-abstract@npm:^1.18.0-next.2, es-abstract@npm:^1.18.2": - version: 1.18.6 - resolution: "es-abstract@npm:1.18.6" + version: 1.19.0 + resolution: "es-abstract@npm:1.19.0" dependencies: call-bind: ^1.0.2 es-to-primitive: ^1.2.1 @@ -4240,14 +4226,16 @@ __metadata: is-callable: ^1.2.4 is-negative-zero: ^2.0.1 is-regex: ^1.1.4 + is-shared-array-buffer: ^1.0.1 is-string: ^1.0.7 + is-weakref: ^1.0.1 object-inspect: ^1.11.0 object-keys: ^1.1.1 object.assign: ^4.1.2 string.prototype.trimend: ^1.0.4 string.prototype.trimstart: ^1.0.4 unbox-primitive: ^1.0.1 - checksum: 8903ed187a9f66a8b21385401770124b37ded75a9cd99c7ea22e709ca667e7b549f37dc8bf9bf458a6cdb908c95a16fed389e2871bb3a28bfaab46db555cb1f3 + checksum: 107eaf54c72405c4956211aae5ee13fab95582ad40efa3890355a4f6a65fe48b6968fe9e36e9a4f408d330d56655703cf214fa750776c07990dc189ffe67cd26 languageName: node linkType: hard @@ -4911,8 +4899,8 @@ fsevents@~2.3.2: linkType: hard "glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.1.7": - version: 7.1.7 - resolution: "glob@npm:7.1.7" + version: 7.2.0 + resolution: "glob@npm:7.2.0" dependencies: fs.realpath: ^1.0.0 inflight: ^1.0.4 @@ -4920,7 +4908,7 @@ fsevents@~2.3.2: minimatch: ^3.0.4 once: ^1.3.0 path-is-absolute: ^1.0.0 - checksum: b61f48973bbdcf5159997b0874a2165db572b368b931135832599875919c237fc05c12984e38fe828e69aa8a921eb0e8a4997266211c517c9cfaae8a93988bb8 + checksum: 78a8ea942331f08ed2e055cb5b9e40fe6f46f579d7fd3d694f3412fe5db23223d29b7fee1575440202e9a7ff9a72ab106a39fee39934c7bedafe5e5f8ae20134 languageName: node linkType: hard @@ -5597,11 +5585,11 @@ fsevents@~2.3.2: linkType: hard "is-core-module@npm:^2.2.0": - version: 2.6.0 - resolution: "is-core-module@npm:2.6.0" + version: 2.7.0 + resolution: "is-core-module@npm:2.7.0" dependencies: has: ^1.0.3 - checksum: 183b3b96fed19822b13959876b0317e61fc2cb5ebcbc21639904c81f7ae328af57f8e18cc4750a9c4abebd686130c70d34a89521e57dbe002edfa4614507ce18 + checksum: 8ec6dc714438ef9dc4dae10c94d21bd5aa67244da7e85bd9e42f0fd298514181214f6bebe358a486477c1242458b170ad7a8c936be0be15d465862fa61d3d1c7 languageName: node linkType: hard @@ -5726,11 +5714,11 @@ fsevents@~2.3.2: linkType: hard "is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:~4.0.1": - version: 4.0.1 - resolution: "is-glob@npm:4.0.1" + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" dependencies: is-extglob: ^2.1.1 - checksum: 84627cad11b4e745f5db5a163f32c47b711585a5ff6e14f8f8d026db87f4cdd3e2c95f6fa1f94ad22e469f36d819ae2814f03f9c668b164422ac3354a94672d3 + checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 languageName: node linkType: hard @@ -5813,6 +5801,13 @@ fsevents@~2.3.2: languageName: node linkType: hard +"is-shared-array-buffer@npm:^1.0.1": + version: 1.0.1 + resolution: "is-shared-array-buffer@npm:1.0.1" + checksum: 2ffb92533e64e2876e6cfe6906871d28400b6f1a53130fe652ec8007bc0e5044d05e7af8e31bdc992fbba520bd92938cfbeedd0f286be92f250c7c76191c4d90 + languageName: node + linkType: hard + "is-ssh@npm:^1.3.0": version: 1.3.3 resolution: "is-ssh@npm:1.3.3" @@ -5847,6 +5842,15 @@ fsevents@~2.3.2: languageName: node linkType: hard +"is-weakref@npm:^1.0.1": + version: 1.0.1 + resolution: "is-weakref@npm:1.0.1" + dependencies: + call-bind: ^1.0.0 + checksum: fdafb7b955671dd2f9658ff47c86e4025c0650fc68a3542a40e5a75898a763b1abd6b1e1f9f13207eed49541cdd76af67d73c44989ea358b201b70274cf8f6c1 + languageName: node + linkType: hard + "is-windows@npm:^1.0.2": version: 1.0.2 resolution: "is-windows@npm:1.0.2" @@ -5903,11 +5907,11 @@ fsevents@~2.3.2: linkType: hard "jiti@npm:^1.9.2": - version: 1.12.0 - resolution: "jiti@npm:1.12.0" + version: 1.12.5 + resolution: "jiti@npm:1.12.5" bin: jiti: bin/jiti.js - checksum: 7490f80be8504f107c0983f9e6dd38ff55764f295a334075580468d01d63a2c7057be1847e389ae3c86e09cfcd60e653b51a2c00ca4d175a26e392eb3471f96a + checksum: 00a1674f38b77c725597c175389da67894d08b386d1d3dac9ecafec3abaf75793b2ea369ed2e688f2e03f495488c843da790c111cc5e24aa533c09051a6fe704 languageName: node linkType: hard @@ -6436,14 +6440,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"mime-db@npm:1.49.0": - version: 1.49.0 - resolution: "mime-db@npm:1.49.0" - checksum: 3744efc45b17896ff8a5934a761c434d5ffe3c7816662002d799ca9934347e00f99ae4d9b4ddf1c48d391cc9e522cc4523a6e77e7701f8e27c426e3e1d6e215a - languageName: node - linkType: hard - -"mime-db@npm:>= 1.43.0 < 2": +"mime-db@npm:1.50.0, mime-db@npm:>= 1.43.0 < 2": version: 1.50.0 resolution: "mime-db@npm:1.50.0" checksum: 95fcc19c3664ae72391c8a7e4015dde7fb6817c98c951493ca3a1d48050feb8ee08810a372ce7d9e16310042d26e5bda168916f600583a9a583655eeea8ff5f5 @@ -6451,11 +6448,11 @@ fsevents@~2.3.2: linkType: hard "mime-types@npm:^2.1.19, mime-types@npm:^2.1.27, mime-types@npm:^2.1.30, mime-types@npm:~2.1.24": - version: 2.1.32 - resolution: "mime-types@npm:2.1.32" + version: 2.1.33 + resolution: "mime-types@npm:2.1.33" dependencies: - mime-db: 1.49.0 - checksum: 4487dfd2f872126d2c219ec731ad47a6169a438d5a4cce6ecef7594ce08eaefaf0d85429485a76ec005f095016c7ec488a24cf8bfcc0ea06de0355e23395746f + mime-db: 1.50.0 + checksum: 05f2a0b3f169fbc51d79bdc7674ceb379dd07dbeadb0143059a7def865224686ee9f9051aeb340e98b6c11dbc06794ce0122181db4312cb1ad054fd90b0d510e languageName: node linkType: hard @@ -6706,12 +6703,19 @@ fsevents@~2.3.2: languageName: node linkType: hard +"nanocolors@npm:^0.2.12, nanocolors@npm:^0.2.2, nanocolors@npm:^0.2.8": + version: 0.2.12 + resolution: "nanocolors@npm:0.2.12" + checksum: a34a63dcca29eede3db41afd1421f130423fc99e73f6c89166f57815bbf0441f02a6112651b068acfd309707215f48eec15dd38e790a8225d6762503a7c175c6 + languageName: node + linkType: hard + "nanoid@npm:^3.1.23": - version: 3.1.25 - resolution: "nanoid@npm:3.1.25" + version: 3.1.28 + resolution: "nanoid@npm:3.1.28" bin: nanoid: bin/nanoid.cjs - checksum: e2353828c7d8fde65265e9c981380102e2021f292038a93fd27288bad390339833286e8cbc7531abe1cb2c6b317e55f38b895dcb775151637bb487388558e0ff + checksum: ae2fa9f3ce7a690ec62fc2fdf92345f023b20db760024f767c25ad392bde6414dc0b44a8e66dc1209426f36e4771e63b09ad2b49d8f1b04063b37e21b46af8d0 languageName: node linkType: hard @@ -6768,9 +6772,11 @@ fsevents@~2.3.2: linkType: hard "node-fetch@npm:^2.6.1": - version: 2.6.2 - resolution: "node-fetch@npm:2.6.2" - checksum: de367eae1dfbc0e12283c1cf92256ea7fba7eac8655e2e51ebb217727162396fc6cf24689ef9fc6accf075e3991e2ffaa061f7cfaa958215329649b2297ff06d + version: 2.6.5 + resolution: "node-fetch@npm:2.6.5" + dependencies: + whatwg-url: ^5.0.0 + checksum: 4e83db450718e70762882f00d96f647a7f2f3170035225934ddd5450cb1d91ef339ceb180d3687bcb0a6ed78c3fa5636ce8d3e44ec81ab59e0224ebf8965f65f languageName: node linkType: hard @@ -6842,10 +6848,10 @@ fsevents@~2.3.2: languageName: node linkType: hard -"node-releases@npm:^1.1.75": - version: 1.1.76 - resolution: "node-releases@npm:1.1.76" - checksum: 10174cb880fffbb2896954599a2551da66127dd3c65703c827536fe9a4b4431545a9e3378c2006fb5ba59d0f0764ceff87c9f7eb0e84fabf7958411fccd0edd1 +"node-releases@npm:^1.1.76": + version: 1.1.77 + resolution: "node-releases@npm:1.1.77" + checksum: eb2fcb45310e7d77f82bfdadeca546a698d258e011f15d88ad9a452a5e838a672ec532906581096ca19c66284a788330c3b09227ffc540e67228730f41b9c2e2 languageName: node linkType: hard @@ -8249,13 +8255,12 @@ fsevents@~2.3.2: linkType: hard "postcss@npm:^7.0.0, postcss@npm:^7.0.1, postcss@npm:^7.0.14, postcss@npm:^7.0.17, postcss@npm:^7.0.2, postcss@npm:^7.0.27, postcss@npm:^7.0.32, postcss@npm:^7.0.36, postcss@npm:^7.0.5, postcss@npm:^7.0.6": - version: 7.0.36 - resolution: "postcss@npm:7.0.36" + version: 7.0.38 + resolution: "postcss@npm:7.0.38" dependencies: - chalk: ^2.4.2 + nanocolors: ^0.2.2 source-map: ^0.6.1 - supports-color: ^6.1.0 - checksum: 4cfc0989b9ad5d0e8971af80d87f9c5beac5c84cb89ff22ad69852edf73c0a2fa348e7e0a135b5897bf893edad0fe86c428769050431ad9b532f072ff530828d + checksum: 737ba0355721880532167d3fbdc580a5ba95a5398b86f3ace610eff99aa11f3c32eb8eac0cfd8ea201a5372f43af3ed7bb6e7643263956fe1d36e927aaf3c4d4 languageName: node linkType: hard @@ -9117,9 +9122,9 @@ fsevents@~2.3.2: linkType: hard "signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3": - version: 3.0.4 - resolution: "signal-exit@npm:3.0.4" - checksum: e72633b05df8d65035a0b31718b1a587f55b25953a8e7b959f6c3a963cc0abcb70a0d78a7e0792bc104c874525efdc619e823095d382a775641e3867b1b68c54 + version: 3.0.5 + resolution: "signal-exit@npm:3.0.5" + checksum: a1d3d0d63f581bd298b30ed8f6de21b73a0fe5a0c0f123b2e8ed7168bbff8f4c1a45e681de12a1966a89bb725d8eb727816be1c436e136951f31953e4a201587 languageName: node linkType: hard @@ -9377,11 +9382,11 @@ fsevents@~2.3.2: linkType: hard "std-env@npm:^2.2.1, std-env@npm:^2.3.0": - version: 2.3.0 - resolution: "std-env@npm:2.3.0" + version: 2.3.1 + resolution: "std-env@npm:2.3.1" dependencies: - ci-info: ^3.0.0 - checksum: da0b81e217d920770448e53d660b6b0800d3f6fde201812cb7f5505a6fffe578b21188301214fecc227cc2db6849eb736f6d1975e5fa7ee179e9240da81fc88b + ci-info: ^3.1.1 + checksum: 049be0d6fb7ff544b3061a53ccaddd3ab2f6930f50b432f54dc82b22cb813c6e408ed69807c7c6bc592fccfc92d5c431dcc1aacd7c9ca99d304948f3149a08da languageName: node linkType: hard @@ -9460,25 +9465,14 @@ fsevents@~2.3.2: languageName: node linkType: hard -"string-width@npm:^3.0.0": - version: 3.1.0 - resolution: "string-width@npm:3.1.0" - dependencies: - emoji-regex: ^7.0.1 - is-fullwidth-code-point: ^2.0.0 - strip-ansi: ^5.1.0 - checksum: 57f7ca73d201682816d573dc68bd4bb8e1dff8dc9fcf10470fdfc3474135c97175fec12ea6a159e67339b41e86963112355b64529489af6e7e70f94a7caf08b2 - languageName: node - linkType: hard - "string-width@npm:^4.0.0, string-width@npm:^4.1.0, string-width@npm:^4.2.2": - version: 4.2.2 - resolution: "string-width@npm:4.2.2" + version: 4.2.3 + resolution: "string-width@npm:4.2.3" dependencies: emoji-regex: ^8.0.0 is-fullwidth-code-point: ^3.0.0 - strip-ansi: ^6.0.0 - checksum: 343e089b0e66e0f72aab4ad1d9b6f2c9cc5255844b0c83fd9b53f2a3b3fd0421bdd6cb05be96a73117eb012db0887a6c1d64ca95aaa50c518e48980483fea0ab + strip-ansi: ^6.0.1 + checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb languageName: node linkType: hard @@ -9538,21 +9532,12 @@ fsevents@~2.3.2: languageName: node linkType: hard -"strip-ansi@npm:^5.1.0": - version: 5.2.0 - resolution: "strip-ansi@npm:5.2.0" +"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" dependencies: - ansi-regex: ^4.1.0 - checksum: bdb5f76ade97062bd88e7723aa019adbfacdcba42223b19ccb528ffb9fb0b89a5be442c663c4a3fb25268eaa3f6ea19c7c3fbae830bd1562d55adccae1fcec46 - languageName: node - linkType: hard - -"strip-ansi@npm:^6.0.0": - version: 6.0.0 - resolution: "strip-ansi@npm:6.0.0" - dependencies: - ansi-regex: ^5.0.0 - checksum: 04c3239ede44c4d195b0e66c0ad58b932f08bec7d05290416d361ff908ad282ecdaf5d9731e322c84f151d427436bde01f05b7422c3ec26dd927586736b0e5d0 + ansi-regex: ^5.0.1 + checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c languageName: node linkType: hard @@ -9603,15 +9588,6 @@ fsevents@~2.3.2: languageName: node linkType: hard -"supports-color@npm:^6.1.0": - version: 6.1.0 - resolution: "supports-color@npm:6.1.0" - dependencies: - has-flag: ^3.0.0 - checksum: 74358f9535c83ee113fbaac354b11e808060f6e7d8722082ee43af3578469134e89d00026dce2a6b93ce4e5b89d0e9a10f638b2b9f64c7838c2fb2883a47b3d5 - languageName: node - linkType: hard - "supports-color@npm:^7.0.0, supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -9724,15 +9700,15 @@ fsevents@~2.3.2: linkType: hard "terser@npm:^5.3.4": - version: 5.8.0 - resolution: "terser@npm:5.8.0" + version: 5.9.0 + resolution: "terser@npm:5.9.0" dependencies: commander: ^2.20.0 source-map: ~0.7.2 source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: 770b7d3fad7eece4a423464a9774e4456b7aca70b869d0c783bde42d7453fac2670ef7532dbce0a5a6f79038c367f2cb6353995190b730e2c52cb4914f3d671e + checksum: 11c1246b1991015a8881742878af779e3863fad42f626ffda957dbf28c94bf51e7994cffb9ffbec86ff3c23ab45ffa6d79d453c15e664306e35fc7b2c4eee5f4 languageName: node linkType: hard @@ -9877,6 +9853,13 @@ fsevents@~2.3.2: languageName: node linkType: hard +"tr46@npm:~0.0.3": + version: 0.0.3 + resolution: "tr46@npm:0.0.3" + checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3 + languageName: node + linkType: hard + "ts-pnp@npm:^1.1.6": version: 1.2.0 resolution: "ts-pnp@npm:1.2.0" @@ -10380,6 +10363,13 @@ fsevents@~2.3.2: languageName: node linkType: hard +"webidl-conversions@npm:^3.0.0": + version: 3.0.1 + resolution: "webidl-conversions@npm:3.0.1" + checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c + languageName: node + linkType: hard + "webpack-bundle-analyzer@npm:^4.4.1": version: 4.4.2 resolution: "webpack-bundle-analyzer@npm:4.4.2" @@ -10500,6 +10490,16 @@ fsevents@~2.3.2: languageName: node linkType: hard +"whatwg-url@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-url@npm:5.0.0" + dependencies: + tr46: ~0.0.3 + webidl-conversions: ^3.0.0 + checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c + languageName: node + linkType: hard + "which-boxed-primitive@npm:^1.0.2": version: 1.0.2 resolution: "which-boxed-primitive@npm:1.0.2" diff --git a/test/presets/_tests.mjs b/test/presets/_tests.mjs index 7db7df250c..fd30e4711f 100644 --- a/test/presets/_tests.mjs +++ b/test/presets/_tests.mjs @@ -9,11 +9,11 @@ import { fixtureDir, resolveWorkspace } from '../utils.mjs' const isBridge = Boolean(process.env.TEST_BRIDGE) -export function importModule (path) { +export function importModule(path) { return import(pathToFileURL(path).href) } -export function setupTest (preset) { +export function setupTest(preset) { const fixture = isBridge ? 'bridge' : 'basic' const rootDir = fixtureDir(fixture) const buildDir = resolve(rootDir, '.nuxt-' + preset) @@ -28,7 +28,7 @@ export function setupTest (preset) { this.timeout(60000) const nuxtCLI = isBridge ? resolve(ctx.rootDir, 'node_modules/nuxt/bin/nuxt.js') - : resolveWorkspace('packages/nuxi/bin/nuxi.cjs') + : resolveWorkspace('packages/nuxi/bin/nuxi.mjs') await execa('node', [nuxtCLI, 'build', ctx.rootDir], { env: { @@ -49,11 +49,11 @@ export function setupTest (preset) { return ctx } -export async function startServer (ctx, handle) { +export async function startServer(ctx, handle) { ctx.server = await listen(handle) } -export function testNitroBehavior (_ctx, getHandler) { +export function testNitroBehavior(_ctx, getHandler) { let handler it('setup handler', async () => { diff --git a/test/utils.mjs b/test/utils.mjs index 2f70ba0cae..94e5825b08 100644 --- a/test/utils.mjs +++ b/test/utils.mjs @@ -1,23 +1,23 @@ import { existsSync, readFileSync, writeFileSync, rmSync, mkdirSync } from 'fs' import { execSync } from 'child_process' import { resolve, dirname } from 'pathe' -import { fileURLToPath } from 'url' import defu from 'defu' import hash from 'object-hash' import execa from 'execa' +import { createCommonJS } from 'mlly' -const __dirname = dirname(fileURLToPath(import.meta.url)) +const cjs = createCommonJS(import.meta.url) export function resolveWorkspace (name) { - return resolve(__dirname, '../', name) + return resolve(cjs.__dirname, '../', name) } export function fixtureDir (name) { - return resolve(__dirname, 'fixtures', name) + return resolve(cjs.__dirname, 'fixtures', name) } export async function execNuxtCLI (args, opts) { - const nuxtCLI = resolveWorkspace('packages/nuxi/bin/nuxi.cjs') + const nuxtCLI = resolveWorkspace('packages/nuxi/bin/nuxi.mjs') await execa('node', [nuxtCLI, ...args], opts) } diff --git a/tsconfig.json b/tsconfig.json index 82b4c0b2d6..6321141b31 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { - "esModuleInterop": true, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, "skipLibCheck": true, "target": "ESNext", "module": "ESNext", @@ -15,8 +16,12 @@ "chai" ], "paths": { - "#app": ["./packages/nuxt3/src/app/index"], - "#app/*": ["./packages/nuxt3/src/app/*"] + "#app": [ + "./packages/nuxt3/src/app/index" + ], + "#app/*": [ + "./packages/nuxt3/src/app/*" + ] } }, "exclude": [ diff --git a/yarn.lock b/yarn.lock index 7c4c1db94f..e90c784f71 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1448,6 +1448,7 @@ __metadata: estree-walker: ^2.0.2 fs-extra: ^10.0.0 magic-string: ^0.25.7 + mlly: ^0.2.2 node-fetch: ^3.0.0 nuxi: ^0.10.0 nuxt-swc: ^0.1.0 @@ -1492,7 +1493,7 @@ __metadata: version: 0.0.0-use.local resolution: "@nuxt/kit@workspace:packages/kit" dependencies: - "@types/lodash": ^4.14.175 + "@types/lodash.template": ^4 consola: ^2.15.3 create-require: ^1.1.1 defu: ^5.0.0 @@ -1501,7 +1502,7 @@ __metadata: hash-sum: ^2.0.0 hookable: ^5.0.0 jiti: ^1.12.6 - lodash: ^4.17.21 + lodash.template: ^4.5.0 pathe: ^0.2.0 rc9: ^1.2.0 scule: ^0.2.1 @@ -1559,6 +1560,7 @@ __metadata: jiti: ^1.12.6 listhen: ^0.2.4 mime: ^2.5.2 + mlly: ^0.2.2 node-fetch: ^3.0.0 ohmyfetch: ^0.3.1 ora: ^6.0.1 @@ -1575,7 +1577,6 @@ __metadata: unbuild: latest unenv: ^0.3.10 unstorage: ^0.2.8 - upath: ^2.0.1 vue: 3.2.19 vue-bundle-renderer: ^0.3.1 vue-server-renderer: ^2.6.14 @@ -1643,9 +1644,10 @@ __metadata: fs-extra: ^10.0.0 glob: ^7.2.0 hash-sum: ^2.0.0 - lodash: ^4.17.21 + lodash-es: ^4.17.21 memfs: ^3.3.0 mini-css-extract-plugin: ^2.3.0 + mlly: ^0.2.2 pathe: ^0.2.0 pify: ^5.0.0 postcss: ^8.3.8 @@ -2281,7 +2283,16 @@ __metadata: languageName: node linkType: hard -"@types/lodash@npm:^4.14.175": +"@types/lodash.template@npm:^4": + version: 4.5.0 + resolution: "@types/lodash.template@npm:4.5.0" + dependencies: + "@types/lodash": "*" + checksum: 7650ecfad4ee1d51404913891f74f48c7837ba9b66fd4681624c943fa8df85231e5efb5339927f6542e9ef4bedb6aaac99f6e878118f2bdb04198bc86013209a + languageName: node + linkType: hard + +"@types/lodash@npm:*": version: 4.14.175 resolution: "@types/lodash@npm:4.14.175" checksum: 50721f33faa542f1b9f62f2ba769ed353c6036711e92bd89ce569f2ed247e38fb2a2899f6fd46466b1690fea7ae0239471e6a6093c54e8f2b0613e43e8eac19c @@ -8827,6 +8838,13 @@ fsevents@~2.3.2: languageName: node linkType: hard +"lodash-es@npm:^4.17.21": + version: 4.17.21 + resolution: "lodash-es@npm:4.17.21" + checksum: 05cbffad6e2adbb331a4e16fbd826e7faee403a1a04873b82b42c0f22090f280839f85b95393f487c1303c8a3d2a010048bf06151a6cbe03eee4d388fb0a12d2 + languageName: node + linkType: hard + "lodash._reinterpolate@npm:^3.0.0": version: 3.0.0 resolution: "lodash._reinterpolate@npm:3.0.0" @@ -9460,7 +9478,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"mlly@npm:^0.2.4": +"mlly@npm:^0.2.2, mlly@npm:^0.2.4": version: 0.2.4 resolution: "mlly@npm:0.2.4" dependencies: @@ -10050,6 +10068,7 @@ fsevents@~2.3.2: fsevents: ~2.3.2 jiti: ^1.12.6 listhen: ^0.2.4 + mlly: ^0.2.2 mri: ^1.2.0 pathe: ^0.2.0 scule: ^0.2.1 @@ -10059,8 +10078,8 @@ fsevents@~2.3.2: fsevents: optional: true bin: - nu: ./bin/nuxi.cjs - nuxi: ./bin/nuxi.cjs + nu: ./bin/nuxi.mjs + nuxi: ./bin/nuxi.mjs languageName: unknown linkType: soft @@ -10153,6 +10172,7 @@ fsevents@~2.3.2: hash-sum: ^2.0.0 hookable: ^5.0.0 ignore: ^5.1.8 + mlly: ^0.2.2 nuxi: ^0.10.0 ohmyfetch: ^0.3.1 pathe: ^0.2.0 @@ -10169,7 +10189,7 @@ fsevents@~2.3.2: "@vue/shared": 3.2.19 vue: 3.2.19 bin: - nuxt: ./bin/nuxt.cjs + nuxt: ./bin/nuxt.mjs languageName: unknown linkType: soft