refactor: add getNitroConfig for consolidating different nitro config sources

This commit is contained in:
Ayo Ayco 2025-01-10 17:23:31 +01:00
parent 5095810077
commit c282f37fae
10 changed files with 57 additions and 36 deletions

View file

@ -3,7 +3,6 @@
import { consola } from 'consola'
import { defineCommand } from 'citty'
import { dirname, resolve } from 'pathe'
import { loadConfig } from 'c12'
import {
build,
copyPublicAssets,
@ -12,26 +11,24 @@ import {
prerender,
} from 'nitropack'
import { fileURLToPath } from 'node:url'
import { nitroConfig as mcflyNitroConfig } from '../../runtime/nitro-config.js'
import { getNitroConfig } from '../../get-nitro-config.js'
async function _build(args) {
consola.start('Building project...')
try {
const rootDir = resolve(args.dir || args._dir || '.')
const { config: mcflyConfig } = await loadConfig({ name: 'mcfly' })
const { config: nitroConfig } = await loadConfig({ name: 'nitro' })
const nitroConfig = await getNitroConfig()
const nitro = await createNitro({
rootDir,
dev: false,
...nitroConfig,
minify: args.minify,
preset: args.preset,
// spread mcfly.nitro config
...(mcflyConfig.nitro ?? {}),
...(nitroConfig ?? {}),
...mcflyNitroConfig,
})
nitro.options.runtimeConfig.mcfly = mcflyConfig
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)

View file

@ -12,10 +12,9 @@ import {
prerender,
} from 'nitropack'
import { resolve } from 'pathe'
import { loadConfig } from 'c12'
import { fileURLToPath } from 'node:url'
import { dirname } from 'pathe'
import { nitroConfig as mcflyNitroConfig } from '../../runtime/nitro-config.js'
import { getNitroConfig } from '../../get-nitro-config.js'
const hmrKeyRe = /^runtimeConfig\.|routeRules\./
const __filename = fileURLToPath(import.meta.url)
@ -42,8 +41,6 @@ async function serve(args) {
* @type {string}
*/
const rootDir = resolve(args.dir || args._dir || '.')
const { config: mcflyConfig } = await loadConfig({ name: 'mcfly' })
const { config: nitroConfig } = await loadConfig({ name: 'nitro' })
/**
* @typedef {import('nitropack').Nitro} Nitro
@ -60,6 +57,8 @@ async function serve(args) {
await nitro.close()
}
const nitroConfig = await getNitroConfig()
// create new nitro
nitro = await createNitro(
{
@ -67,10 +66,7 @@ async function serve(args) {
dev: true,
preset: 'nitro-dev',
_cli: { command: 'dev' },
// spread mcfly.nitro config
...(mcflyConfig.nitro ?? {}),
...(nitroConfig ?? {}),
...mcflyNitroConfig,
...nitroConfig,
},
{
watch: true,
@ -95,7 +91,6 @@ async function serve(args) {
}
)
nitro.hooks.hookOnce('restart', reload)
nitro.options.runtimeConfig.mcfly = mcflyConfig
nitro.options.handlers.push({
middleware: true,

View file

@ -0,0 +1,30 @@
import { loadConfig } from 'c12'
import { mcflyNitroConfig } from './mcfly-nitro-config.js'
/**
* @typedef {import('nitropack').NitroConfig} NitroConfig
*/
/**
* @returns {Promise<NitroConfig>}
*/
export async function getNitroConfig() {
const { config: nitroConfig } = await loadConfig({ name: 'nitro' })
const { config: mcflyConfig } = await loadConfig({ name: 'mcfly' })
return {
// nitro config within user's mcfly.config.mjs
...(mcflyConfig.nitro ?? {}),
// nitro config from nitro.config.mjs
...(nitroConfig ?? {}),
// McFly standard nitro config
...mcflyNitroConfig,
// expose mcfly config to framework runtime
runtimeConfig: {
mcfly: mcflyConfig,
},
}
}

View file

@ -2,7 +2,7 @@
* @typedef {import('nitropack').NitroConfig} NitroConfig
* @type {NitroConfig}
*/
export const nitroConfig = {
export const mcflyNitroConfig = {
framework: {
name: 'McFly',
},

View file

@ -10,8 +10,7 @@
"scripts": {
"version": "npm version",
"publish": "npm publish",
"test": "echo \"Error: no test specified\" && exit 1",
"build:middleware": "npx esbuild route-middleware.js --bundle --outfile=mcfly-middleware.js"
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",

View file

@ -2,6 +2,7 @@ import { eventHandler } from 'h3'
import { useRuntimeConfig, useStorage } from 'nitropack/runtime'
import { createHooks } from 'hookable'
import { consola } from 'consola'
import { colorize } from 'consola/utils'
import {
hooks as mcflyHooks,
@ -9,7 +10,7 @@ import {
evaluateServerScripts,
injectHtmlFragments,
injectCustomElements,
} from '@mcflyjs/core/runtime/index.js'
} from '@mcflyjs/core/runtime/index.js' // important to import from installed node_module because this script is passed to another context
/**
* @typedef {import('../config').McFlyConfig} Config
@ -29,18 +30,17 @@ export default eventHandler(async (event) => {
let { mcfly: config } = useRuntimeConfig()
const storage = useStorage()
const publicAssets = (await storage.getKeys('root:public')).map(
(key) => `/${key.replace('root:public:', '')}`
)
// if not page, don't render
if (event.path.startsWith('/api') || publicAssets.includes(event.path)) {
if (event.path.startsWith('/api')) {
return
}
if (!config || Object.keys(config).length === 0) {
config = defaultMcflyConfig
consola.warn(`[WARN]: McFly configuration not loaded, using defaults...`)
consola.warn(
`[WARN]: McFly configuration not found, using defaults...`,
defaultMcflyConfig
)
}
const plugins = config.plugins ?? []
@ -96,11 +96,11 @@ export default eventHandler(async (event) => {
}
const timeEnd = performance.now()
consola.info(
'Page rendered in',
consola.log(
colorize('green', event.path),
'rendered in',
Math.round(timeEnd - timeStart),
'ms:',
event.path
'ms'
)
return (
html ??

View file

@ -4,4 +4,4 @@ export { getFiles } from './get-files.mjs'
export { hooks } from './hooks.mjs'
export { injectCustomElements } from './inject-elements.mjs'
export { injectHtmlFragments } from './inject-fragments.mjs'
export { nitroConfig } from './nitro-config.js'
export { mcflyNitroConfig as nitroConfig } from '../mcfly-nitro-config.js'

View file

@ -1,5 +1,5 @@
import { ELEMENT_NODE, parse, render, walkSync } from 'ultrahtml'
import { getFiles } from '@mcflyjs/core/runtime/get-files.mjs'
import { getFiles } from './get-files.mjs'
/**
* @typedef {import('../../config/index.js').McFlyConfig} Config

View file

@ -1,5 +1,5 @@
import { ELEMENT_NODE, parse, render, walkSync } from 'ultrahtml'
import { getFiles } from '@mcflyjs/core/runtime/get-files.mjs'
import { getFiles } from './get-files.mjs'
/**
* @typedef {import('ultrahtml').Node} HtmlNode

View file

@ -21,7 +21,7 @@
"dev": "mcfly serve",
"build": "mcfly build",
"preview": "node .output/server/index.mjs",
"build:preview": "pnpm run build && pnpm run preview",
"build:preview": "pnpm run build --preset=node-server && pnpm run preview",
"deploy": "netlify deploy --site=$NETLIFY_SITE_ID --dir=dist --prod"
},
"dependencies": {