fix(core): catch undefined plugins
This commit is contained in:
parent
73617647db
commit
014deadf75
5 changed files with 4 additions and 182 deletions
|
@ -1,130 +0,0 @@
|
||||||
import { consola } from 'consola'
|
|
||||||
import { eventHandler } from 'h3'
|
|
||||||
import { createHooks } from 'hookable'
|
|
||||||
import { hooks as mcflyHooks } from './hooks.mjs'
|
|
||||||
import { evaluateServerScripts } from './evaluate-scripts.mjs'
|
|
||||||
import { injectHtmlFragments } from './inject-fragments.mjs'
|
|
||||||
import { injectCustomElements } from './inject-elements.mjs'
|
|
||||||
import defaultMcflyConfig from './default-mcfly-config.mjs'
|
|
||||||
import { loadConfig } from 'c12'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @typedef {import('../config').McFlyConfig} Config
|
|
||||||
* @typedef {import('unstorage').Storage} Storage
|
|
||||||
* @typedef {import('unstorage').StorageValue} StorageValue
|
|
||||||
* @typedef {import('h3').EventHandler} EventHandler
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Intercepts all routes and assembles the correct HTML to return
|
|
||||||
* @deprecated
|
|
||||||
* @param {{
|
|
||||||
* storage: Storage
|
|
||||||
* }} param0
|
|
||||||
* @returns {EventHandler}
|
|
||||||
*/
|
|
||||||
export function useMcFlyRoute({ storage }) {
|
|
||||||
return eventHandler(async (event) => {
|
|
||||||
const hooks = createHooks()
|
|
||||||
Object.keys(mcflyHooks).forEach((hookName) => hooks.addHooks(hookName))
|
|
||||||
const { path } = event
|
|
||||||
let { config } = await loadConfig({ name: 'mcfly' })
|
|
||||||
|
|
||||||
if (!config || Object.keys(config).length === 0) {
|
|
||||||
config = defaultMcflyConfig
|
|
||||||
consola.warn(`[WARN]: McFly configuration not loaded, using defaults...`)
|
|
||||||
}
|
|
||||||
|
|
||||||
const plugins = config.plugins
|
|
||||||
|
|
||||||
plugins.forEach((plugin) => {
|
|
||||||
const pluginHooks = Object.keys(plugin)
|
|
||||||
pluginHooks.forEach((pluginHook) => {
|
|
||||||
hooks.hook(pluginHook, plugin[pluginHook])
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
const { components: componentType } = config
|
|
||||||
let html = await getHtml(path, storage)
|
|
||||||
|
|
||||||
if (html) {
|
|
||||||
const transforms = [
|
|
||||||
{
|
|
||||||
fn: evaluateServerScripts,
|
|
||||||
args: [''],
|
|
||||||
hook: mcflyHooks.serverScriptsEvaluated,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: injectHtmlFragments,
|
|
||||||
args: [storage],
|
|
||||||
hook: mcflyHooks.fragmentsInjected,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: injectCustomElements,
|
|
||||||
args: [componentType, storage],
|
|
||||||
hook: mcflyHooks.customElementsInjected,
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
if (!!componentType && !!html) {
|
|
||||||
for (const transform of transforms) {
|
|
||||||
html = await transform.fn(html.toString(), ...transform.args)
|
|
||||||
|
|
||||||
// call hook
|
|
||||||
if (transform.hook) {
|
|
||||||
hooks.callHook(transform.hook)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
consola.error('[ERR]: Failed to insert registry', {
|
|
||||||
componentType: !componentType ? 'missing' : 'okay',
|
|
||||||
html: !html ? 'missing' : 'okay',
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (html) {
|
|
||||||
hooks.callHook(mcflyHooks.pageRendered)
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
html ??
|
|
||||||
new Response(
|
|
||||||
'😱 ERROR 404: Not found. You can put a 404.html on the ./src/pages directory to customize this error page.',
|
|
||||||
{ status: 404 }
|
|
||||||
)
|
|
||||||
)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function getPurePath(path) {
|
|
||||||
return path.split('?')[0]
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Gets the correct HTML depending on the path requested
|
|
||||||
* @param {string} path
|
|
||||||
* @param {Storage} storage
|
|
||||||
* @returns {Promise<StorageValue>}
|
|
||||||
*/
|
|
||||||
async function getHtml(path, storage) {
|
|
||||||
const purePath = getPurePath(path)
|
|
||||||
const rawPath =
|
|
||||||
purePath[purePath.length - 1] === '/' ? purePath.slice(0, -1) : purePath
|
|
||||||
const filename = rawPath === '' ? '/index.html' : `${rawPath}.html`
|
|
||||||
const fallback = getPath(rawPath + '/index.html')
|
|
||||||
const filePath = getPath(filename)
|
|
||||||
let html = await storage.getItem(filePath)
|
|
||||||
if (!html) html = await storage.getItem(fallback)
|
|
||||||
if (!html) html = await storage.getItem(getPath('/404.html'))
|
|
||||||
|
|
||||||
return html
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the storage path for a file
|
|
||||||
* @param {string} filename
|
|
||||||
* @returns {string}
|
|
||||||
*/
|
|
||||||
function getPath(filename) {
|
|
||||||
return `assets:pages${filename}`
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
export { useMcFlyRoute } from './event-handler.js'
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@mcflyjs/core",
|
"name": "@mcflyjs/core",
|
||||||
"version": "0.7.0",
|
"version": "0.7.1",
|
||||||
"description": "McFly core package",
|
"description": "McFly core package",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
|
|
|
@ -31,7 +31,7 @@ export default eventHandler(async (event) => {
|
||||||
consola.warn(`[WARN]: McFly configuration not loaded, using defaults...`)
|
consola.warn(`[WARN]: McFly configuration not loaded, using defaults...`)
|
||||||
}
|
}
|
||||||
|
|
||||||
const plugins = config.plugins
|
const plugins = config.plugins ?? []
|
||||||
|
|
||||||
plugins.forEach((plugin) => {
|
plugins.forEach((plugin) => {
|
||||||
const pluginHooks = Object.keys(plugin)
|
const pluginHooks = Object.keys(plugin)
|
||||||
|
|
|
@ -121,15 +121,9 @@ importers:
|
||||||
'@mcflyjs/cli':
|
'@mcflyjs/cli':
|
||||||
specifier: ^0.1.1
|
specifier: ^0.1.1
|
||||||
version: 0.1.1(magicast@0.3.5)
|
version: 0.1.1(magicast@0.3.5)
|
||||||
'@mcflyjs/config':
|
|
||||||
specifier: ^0.2.1
|
|
||||||
version: link:../../packages/config
|
|
||||||
'@mcflyjs/core':
|
'@mcflyjs/core':
|
||||||
specifier: ^0.6.1
|
specifier: ^0.7.1
|
||||||
version: 0.6.1(magicast@0.3.5)(typescript@5.7.2)
|
version: link:../../packages/core
|
||||||
nitropack:
|
|
||||||
specifier: ~2.10.4
|
|
||||||
version: 2.10.4(typescript@5.7.2)
|
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
|
|
||||||
|
@ -607,9 +601,6 @@ packages:
|
||||||
resolution: {integrity: sha512-YT0XVwbUO9SscfoCrNY1Tz92SwLrCKbvHYrPUWjC8UAVaaX8tekdfRDF7DiIr8PX5me3YIZUBnQw0/loFNPhvQ==}
|
resolution: {integrity: sha512-YT0XVwbUO9SscfoCrNY1Tz92SwLrCKbvHYrPUWjC8UAVaaX8tekdfRDF7DiIr8PX5me3YIZUBnQw0/loFNPhvQ==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
'@mcflyjs/core@0.6.1':
|
|
||||||
resolution: {integrity: sha512-ozgpIRpNix7gyuFlB8ofEm+iENMvxQsgyzxMTbIrOM69QYiEV1GsjxWyUqH3QuCwA4UB1KHdyWS+PNaCWSepOQ==}
|
|
||||||
|
|
||||||
'@netlify/functions@2.8.2':
|
'@netlify/functions@2.8.2':
|
||||||
resolution: {integrity: sha512-DeoAQh8LuNPvBE4qsKlezjKj0PyXDryOFJfJKo3Z1qZLKzQ21sT314KQKPVjfvw6knqijj+IO+0kHXy/TJiqNA==}
|
resolution: {integrity: sha512-DeoAQh8LuNPvBE4qsKlezjKj0PyXDryOFJfJKo3Z1qZLKzQ21sT314KQKPVjfvw6knqijj+IO+0kHXy/TJiqNA==}
|
||||||
engines: {node: '>=14.0.0'}
|
engines: {node: '>=14.0.0'}
|
||||||
|
@ -3126,44 +3117,6 @@ snapshots:
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- magicast
|
- magicast
|
||||||
|
|
||||||
'@mcflyjs/core@0.6.1(magicast@0.3.5)(typescript@5.7.2)':
|
|
||||||
dependencies:
|
|
||||||
c12: 2.0.1(magicast@0.3.5)
|
|
||||||
esbuild: 0.24.2
|
|
||||||
esprima: 4.0.1
|
|
||||||
h3: 1.13.0
|
|
||||||
nitropack: 2.10.4(typescript@5.7.2)
|
|
||||||
ultrahtml: 1.5.3
|
|
||||||
transitivePeerDependencies:
|
|
||||||
- '@azure/app-configuration'
|
|
||||||
- '@azure/cosmos'
|
|
||||||
- '@azure/data-tables'
|
|
||||||
- '@azure/identity'
|
|
||||||
- '@azure/keyvault-secrets'
|
|
||||||
- '@azure/storage-blob'
|
|
||||||
- '@capacitor/preferences'
|
|
||||||
- '@deno/kv'
|
|
||||||
- '@electric-sql/pglite'
|
|
||||||
- '@libsql/client'
|
|
||||||
- '@netlify/blobs'
|
|
||||||
- '@planetscale/database'
|
|
||||||
- '@upstash/redis'
|
|
||||||
- '@vercel/blob'
|
|
||||||
- '@vercel/kv'
|
|
||||||
- aws4fetch
|
|
||||||
- better-sqlite3
|
|
||||||
- drizzle-orm
|
|
||||||
- encoding
|
|
||||||
- idb-keyval
|
|
||||||
- magicast
|
|
||||||
- mysql2
|
|
||||||
- rolldown
|
|
||||||
- supports-color
|
|
||||||
- typescript
|
|
||||||
- uWebSockets.js
|
|
||||||
- uploadthing
|
|
||||||
- xml2js
|
|
||||||
|
|
||||||
'@netlify/functions@2.8.2':
|
'@netlify/functions@2.8.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@netlify/serverless-functions-api': 1.26.1
|
'@netlify/serverless-functions-api': 1.26.1
|
||||||
|
|
Loading…
Reference in a new issue