feat: use fastify as server

- remove nitropack
- new @mcflyjs/fastify package
- test-core workspace for testing the new setup
This commit is contained in:
ayo 2026-05-25 22:43:15 +02:00
parent 43ba8bc81b
commit 08c2497fab
31 changed files with 270 additions and 651 deletions

View file

@ -8,7 +8,6 @@
"hookable", "hookable",
"mcfly", "mcfly",
"mcflyjs", "mcflyjs",
"nitropack",
"ultrahtml", "ultrahtml",
"unstorage" "unstorage"
], ],

3
mcfly.config.mjs Normal file
View file

@ -0,0 +1,3 @@
export default {
from: 'root',
}

View file

@ -9,8 +9,7 @@
"types": "./dist/index.d.ts", "types": "./dist/index.d.ts",
"default": "./dist/index.js" "default": "./dist/index.js"
}, },
"./define-mcfly-config": "./dist/define-mcfly-config.js", "./define-config": "./dist/define-config.js"
"./nitro-config": "./dist/nitro-config.js"
}, },
"scripts": { "scripts": {
"build": "tsc --erasableSyntaxOnly", "build": "tsc --erasableSyntaxOnly",
@ -32,8 +31,5 @@
"dependencies": { "dependencies": {
"h3": "^1.15.1", "h3": "^1.15.1",
"web-component-base": "^4.0.0" "web-component-base": "^4.0.0"
},
"devDependencies": {
"nitropack": "~2.11.7"
} }
} }

View file

@ -1,8 +1,6 @@
import type { NitroConfig } from 'nitropack'
export type McFlyConfig = { export type McFlyConfig = {
components: 'js' | 'lit' server: McFlyServer
nitro?: NitroConfig components?: 'js' | 'lit'
plugins?: McFlyPlugin[] plugins?: McFlyPlugin[]
} }
@ -11,7 +9,7 @@ export type McFlyConfig = {
* @param {McFlyConfig} config * @param {McFlyConfig} config
* @returns {function(): McFlyConfig}e * @returns {function(): McFlyConfig}e
*/ */
export function defineMcFlyConfig(config: McFlyConfig) { export function defineConfig(config: McFlyConfig) {
return () => config return () => config
} }
@ -19,3 +17,5 @@ export function defineMcFlyConfig(config: McFlyConfig) {
* TODO: finalize Plugin type * TODO: finalize Plugin type
*/ */
export type McFlyPlugin = {} export type McFlyPlugin = {}
export type McFlyServer = any

View file

@ -1 +1 @@
export { type McFlyConfig, defineMcFlyConfig } from './define-mcfly-config.js' export { type McFlyConfig, defineConfig } from './define-config.js'

View file

@ -3,17 +3,16 @@
"version": "0.8.8", "version": "0.8.8",
"description": "McFly core package", "description": "McFly core package",
"type": "module", "type": "module",
"main": "./dist/cli/index.js", "main": "./dist/index.js",
"bin": { "bin": {
"mcfly": "./dist/cli/index.js" "mcfly": "./dist/index.js"
}, },
"exports": { "exports": {
".": { ".": {
"types": "./dist/cli/index.d.ts", "types": "./dist/index.d.ts",
"default": "./dist/cli/index.js" "default": "./dist/index.js"
}, },
"./runtime": "./dist/runtime/index.js", "./runtime": "./dist/runtime/index.js",
"./cli": "./dist/cli/index.js",
"./package.json": "./package.json" "./package.json": "./package.json"
}, },
"files": [ "files": [
@ -43,7 +42,6 @@
"devalue": "^5.1.1", "devalue": "^5.1.1",
"esprima": "^4.0.1", "esprima": "^4.0.1",
"h3": "^1.15.1", "h3": "^1.15.1",
"nitropack": "^2.11.7",
"pathe": "^2.0.3", "pathe": "^2.0.3",
"ultrahtml": "^1.5.3" "ultrahtml": "^1.5.3"
}, },

View file

@ -1,129 +0,0 @@
#!/usr/bin/env node
import { consola } from 'consola'
import { colorize } from 'consola/utils'
import { defineCommand, type ParsedArgs } from 'citty'
import { createRequire } from 'node:module'
import {
type Nitro,
build,
createDevServer,
createNitro,
prepare,
prerender,
} from 'nitropack'
import { resolve } from 'pathe'
import { fileURLToPath } from 'node:url'
import { dirname } from 'pathe'
import { getMcFlyConfig, getNitroConfig } from '../../get-config.js'
const hmrKeyRe = /^runtimeConfig\.|routeRules\./
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)
async function printInfo() {
try {
const _require = createRequire(import.meta.url)
const mcflyPkg = await _require('@mcflyjs/core/package.json')
const mcflyPkgVersion = `McFly ${colorize('bold', mcflyPkg.version)}`
const nitroPkg = await _require('nitropack/package.json')
const nitroPkgVersion = `Nitro ${nitroPkg.version}`
consola.log(
`${colorize('blue', mcflyPkgVersion)} ${colorize('dim', nitroPkgVersion)}`
)
} catch (e) {
consola.error(e)
}
}
async function serve(args: ParsedArgs) {
try {
// TODO: check for dir type (should be string)
const dir = args.dir?.toString() || args._dir?.toString()
const rootDir: string = resolve(dir || '.')
let nitro: Nitro
const reload = async () => {
// close existing nitro
if (nitro) {
consola.info('Restarting dev server...')
if ('unwatch' in nitro.options._c12) {
await nitro.options._c12.unwatch()
}
await nitro.close()
}
const { mcflyConfig, configFile } = await getMcFlyConfig()
const nitroConfig = await getNitroConfig(mcflyConfig)
// create new nitro
nitro = await createNitro(
{
rootDir,
dev: true,
preset: 'nitro-dev',
_cli: { command: 'dev' },
...nitroConfig,
},
{
watch: true,
c12: {
async onUpdate({ getDiff, newConfig }: any) {
const diff = getDiff()
if (diff.length === 0) {
return // No changes
}
consola.info(
'Nitro config updated:\n' +
diff
.map((entry: unknown) => ` ${entry?.toString()}`)
.join('\n')
)
// TODO: get types for c12 config & remove unknown
// @ts-ignore
await (diff.every((e: unknown) => hmrKeyRe.test(e.key))
? nitro.updateConfig(newConfig.config || {}) // Hot reload
: reload()) // Full reload
},
},
}
)
nitro.hooks.hookOnce('restart', reload)
nitro.options.runtimeConfig.appConfigFile = configFile
nitro.options.handlers.push({
middleware: true,
handler: resolve(__dirname, '../../route-middleware.js'),
})
const server = createDevServer(nitro)
// const listenOptions = parseArgs(args)
await server.listen(1234)
await prepare(nitro)
await prerender(nitro)
await build(nitro)
}
await reload()
} catch (e) {
consola.error(e)
}
}
export default defineCommand({
meta: {
name: 'serve',
description: 'Runs the dev server.',
},
async run({ args }) {
await printInfo()
await serve(args)
},
})
export const exportedForTest = {
serve,
printInfo,
}

View file

@ -3,15 +3,8 @@
import { consola } from 'consola' import { consola } from 'consola'
import { defineCommand, type ParsedArgs } from 'citty' import { defineCommand, type ParsedArgs } from 'citty'
import { dirname, resolve } from 'pathe' import { dirname, resolve } from 'pathe'
import {
build,
copyPublicAssets,
createNitro,
prepare,
prerender,
} from 'nitropack'
import { fileURLToPath } from 'node:url' import { fileURLToPath } from 'node:url'
import { getMcFlyConfig, getNitroConfig } from '../../get-config.js' import { getMcFlyConfig } from '../get-config.js'
async function _build(args: ParsedArgs) { async function _build(args: ParsedArgs) {
consola.start('Building project...') consola.start('Building project...')
@ -21,33 +14,11 @@ async function _build(args: ParsedArgs) {
const rootDir = resolve(dir) const rootDir = resolve(dir)
const { mcflyConfig, configFile } = await getMcFlyConfig() const { mcflyConfig, configFile } = await getMcFlyConfig()
const nitroConfig = await getNitroConfig(mcflyConfig)
const nitro = await createNitro({
rootDir,
dev: false,
...nitroConfig,
minify: args.minify ?? nitroConfig.minify,
preset: args.preset ?? nitroConfig.preset,
})
const __filename = fileURLToPath(import.meta.url) const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename) const __dirname = dirname(__filename)
nitro.options.handlers.push({ consola.info('dir', __dirname)
middleware: true,
handler: resolve(__dirname, '../../route-middleware.js'),
})
nitro.options.runtimeConfig.appConfigFile = configFile
await prepare(nitro)
await copyPublicAssets(nitro)
await prerender(nitro)
await build(nitro)
await nitro.close()
} catch (err) { } catch (err) {
consola.error(err) consola.error(err)
} }

View file

@ -3,8 +3,7 @@
import { consola } from 'consola' import { consola } from 'consola'
import { defineCommand, type ParsedArgs } from 'citty' import { defineCommand, type ParsedArgs } from 'citty'
import { resolve } from 'pathe' import { resolve } from 'pathe'
import { createNitro, writeTypes } from 'nitropack' import { getMcFlyConfig } from '../get-config.js'
import { getMcFlyConfig, getNitroConfig } from '../../get-config.js'
async function prepare(args: ParsedArgs) { async function prepare(args: ParsedArgs) {
consola.start('Preparing McFly workspace...') consola.start('Preparing McFly workspace...')
@ -16,10 +15,8 @@ async function prepare(args: ParsedArgs) {
const dir: string = args.dir?.toString() || args._dir?.toString() || '.' const dir: string = args.dir?.toString() || args._dir?.toString() || '.'
const rootDir = resolve(dir) const rootDir = resolve(dir)
const { mcflyConfig } = await getMcFlyConfig() const { mcflyConfig } = await getMcFlyConfig()
const nitroConfig = await getNitroConfig(mcflyConfig)
const nitro = await createNitro({ rootDir, ...nitroConfig })
await writeTypes(nitro) consola.info({ mcflyConfig, rootDir })
} catch (e) { } catch (e) {
consola.error(e) consola.error(e)
err = e err = e

View file

@ -0,0 +1,57 @@
#!/usr/bin/env node
import { consola } from 'consola'
import { colorize } from 'consola/utils'
import { defineCommand, type ParsedArgs } from 'citty'
import { createRequire } from 'node:module'
import { resolve } from 'pathe'
// import { fileURLToPath } from 'node:url'
// import { dirname } from 'pathe'
import { getMcFlyConfig } from '../get-config.js'
// const __filename = fileURLToPath(import.meta.url)
// const __dirname = dirname(__filename)
async function printInfo() {
try {
const _require = createRequire(import.meta.url)
const mcflyPkg = await _require('@mcflyjs/core/package.json')
const mcflyPkgVersion = `McFly ${colorize('bold', mcflyPkg.version)}`
consola.log(`${colorize('blue', mcflyPkgVersion)}`)
} catch (e) {
consola.error(e)
}
}
async function serve(args: ParsedArgs) {
try {
// TODO: check for dir type (should be string)
const dir = args.dir?.toString() || args._dir?.toString()
const rootDir: string = resolve(dir || '.')
const { mcflyConfig } = await getMcFlyConfig()
/**
* TODO: config for srcDir
*/
mcflyConfig.server.serve({ rootDir: rootDir + '/src', apiDir: '/api' })
} catch (e) {
consola.error(e)
}
}
export default defineCommand({
meta: {
name: 'serve',
description: 'Runs the dev server.',
},
async run({ args }) {
await printInfo()
await serve(args)
},
})
export const exportedForTest = {
serve,
printInfo,
}

View file

@ -1,27 +1,4 @@
import { loadConfig } from 'c12' import { loadConfig } from 'c12'
import { mcflyNitroConfig } from './mcfly-nitro-config.js'
/**
* @typedef {import('nitropack').NitroConfig} NitroConfig
*/
/**
* Create a valid Nitro configuration given a McFly config object
* @returns {Promise<NitroConfig>}
*/
export async function getNitroConfig(mcflyConfig = {}) {
const { config: nitroConfig } = await loadConfig({ name: 'nitro' })
return {
// nitro config in mcfly config
...mcflyConfig.nitro,
// nitro config from nitro config
...(nitroConfig ?? {}),
// McFly standard nitro config
...mcflyNitroConfig,
}
}
export async function getMcFlyConfig() { export async function getMcFlyConfig() {
const { config: mcflyConfig, configFile } = await loadConfig({ const { config: mcflyConfig, configFile } = await loadConfig({

View file

@ -1,35 +0,0 @@
import { type NitroConfig } from 'nitropack'
/**
* @typedef {import('nitropack').NitroConfig} NitroConfig
* @type {NitroConfig}
*/
export const mcflyNitroConfig: NitroConfig = {
framework: {
name: 'McFly',
},
compatibilityDate: '2024-12-08',
srcDir: 'src',
apiDir: 'api',
devServer: {
watch: ['./pages', './components', './api'],
},
serverAssets: [
{
baseName: 'pages',
dir: './pages',
},
{
baseName: 'components',
dir: './components',
},
],
imports: {
presets: [
{
from: 'web-component-base',
imports: ['WebComponent', 'html', 'attachEffect'],
},
],
},
}

View file

@ -1,161 +0,0 @@
import { eventHandler } from 'h3'
import { useStorage } from 'nitropack/runtime'
import { createHooks } from 'hookable'
import { consola } from 'consola'
import { colorize } from 'consola/utils'
import { useRuntimeConfig } from 'nitropack/runtime'
import { dirname, relative } from 'pathe'
import { fileURLToPath } from 'node:url'
import {
hooks as mcflyHooks,
defaultMcflyConfig,
evaluateServerScripts,
injectHtmlFragments,
injectCustomElements,
} from '@mcflyjs/core/runtime' // important to import from installed node_module because this script is passed to another context
/**
* @typedef {import('../config').McFlyConfig} Config
* @typedef {import('unstorage').Storage} Storage
* @typedef {import('unstorage').StorageValue} StorageValue
* @typedef {import('h3').EventHandler} EventHandler
*/
/**
* McFly middleware event handler
*/
export default eventHandler(async (event) => {
const timeStart = performance.now()
const hooks = createHooks()
Object.keys(mcflyHooks).forEach((hookName) => hooks.addHooks(hookName))
const { path } = event
const storage = useStorage()
const { appConfigFile } = useRuntimeConfig()
const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)
let relativePath = relative(__dirname, appConfigFile)
let config
// TODO: this still doesn't work on Netlify
try {
const { default: configFn } = await import(relativePath)
config = configFn()
} catch (err) {
consola.error(err)
}
// if not page, don't render
if (event.path.startsWith('/api')) {
return
}
if (!config || Object.keys(config).length === 0) {
config = defaultMcflyConfig
consola.warn(
`[WARN]: McFly configuration not found, using defaults...`,
defaultMcflyConfig
)
}
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: [event],
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) {
// not sure if we want to await, for now it makes the outcome predictable
await hooks.callHook(transform.hook)
}
}
} else {
consola.error('[ERR]: Failed to insert registry', {
componentType: !componentType ? 'missing' : 'okay',
html: !html ? 'missing' : 'okay',
})
}
}
if (html) {
await hooks.callHook(mcflyHooks.pageRendered)
}
const timeEnd = performance.now()
consola.info(
colorize('green', event.path),
'rendered in',
Math.round(timeEnd - timeStart),
'ms'
)
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 }
)
)
})
/**
* Gets the storage path for a file
* @param {string} filename
* @returns {string}
*/
function getPath(filename) {
return `assets:pages${filename}`
}
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
}

View file

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

View file

@ -1,7 +1,7 @@
import type { ParsedArgs } from 'citty' import type { ParsedArgs } from 'citty'
import consola from 'consola' import consola from 'consola'
import { expect, it, vi } from 'vitest' import { expect, it, vi } from 'vitest'
import { exportedForTest } from '../src/cli/commands/build.js' import { exportedForTest } from '../src/commands/build'
const build = exportedForTest.build const build = exportedForTest.build

View file

@ -1,6 +1,6 @@
import { consola } from 'consola' import { consola } from 'consola'
import { it, expect, vi } from 'vitest' import { it, expect, vi } from 'vitest'
import { exportedForTest } from '../src/cli/commands/prepare.js' import { exportedForTest } from '../src/commands/prepare'
const prepare = exportedForTest.prepare const prepare = exportedForTest.prepare
const mocks = vi.hoisted(() => { const mocks = vi.hoisted(() => {
@ -9,12 +9,6 @@ const mocks = vi.hoisted(() => {
} }
}) })
vi.mock('nitropack', () => {
return {
createNitro: mocks.createNitro,
}
})
it('start prepare script', () => { it('start prepare script', () => {
const spy = vi.spyOn(consola, 'start') const spy = vi.spyOn(consola, 'start')
@ -23,14 +17,6 @@ it('start prepare script', () => {
expect(spy).toHaveBeenCalled() expect(spy).toHaveBeenCalled()
}) })
it.skip('execute nitropack prepare', () => {
const successSpy = vi.spyOn(consola, 'success')
prepare({ dir: 'fakeDir', _: [] })
expect(successSpy).toHaveBeenCalled()
})
it.skip('catch error', () => { it.skip('catch error', () => {
const dir = 'fake-dir' const dir = 'fake-dir'
const errSpy = vi.spyOn(consola, 'error') const errSpy = vi.spyOn(consola, 'error')

View file

@ -0,0 +1,7 @@
import serve from './serve'
export default () => {
return {
serve,
}
}

View file

@ -0,0 +1,16 @@
{
"name": "@mcflyjs/fastify",
"version": "0.0.1",
"type": "module",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"@fastify/autoload": "6.3.1",
"fastify": "5.8.5"
}
}

17
packages/fastify/serve.js Normal file
View file

@ -0,0 +1,17 @@
import Fastify from 'fastify'
import AutoLoad from '@fastify/autoload'
import path from 'node:path'
export default ({ rootDir, apiDir }) => {
const server = Fastify({ logger: true })
server.register(AutoLoad, {
dir: path.join(rootDir, apiDir),
options: {
prefix: apiDir,
},
})
console.log('Watching for file changes in', rootDir)
server.listen({ port: 3000 })
}

View file

@ -37,7 +37,7 @@ importers:
version: 9.1.7 version: 9.1.7
netlify-cli: netlify-cli:
specifier: ^25.6.0 specifier: ^25.6.0
version: 25.6.2(@types/node@25.6.2)(db0@0.3.4(@electric-sql/pglite@0.3.16))(ioredis@5.10.1)(picomatch@4.0.4) version: 25.6.2(@types/node@25.6.2)(db0@0.3.4(@electric-sql/pglite@0.3.16))(ioredis@5.10.1)(picomatch@4.0.4)(rollup@4.60.3)
prettier: prettier:
specifier: ^3.8.3 specifier: ^3.8.3
version: 3.8.3 version: 3.8.3
@ -59,10 +59,6 @@ importers:
web-component-base: web-component-base:
specifier: ^4.0.0 specifier: ^4.0.0
version: 4.1.2 version: 4.1.2
devDependencies:
nitropack:
specifier: ~2.11.7
version: 2.11.13(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.4)
packages/core: packages/core:
dependencies: dependencies:
@ -84,9 +80,6 @@ importers:
h3: h3:
specifier: ^1.15.1 specifier: ^1.15.1
version: 1.15.11 version: 1.15.11
nitropack:
specifier: ^2.11.7
version: 2.11.13(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.4)
pathe: pathe:
specifier: ^2.0.3 specifier: ^2.0.3
version: 2.0.3 version: 2.0.3
@ -148,6 +141,15 @@ importers:
specifier: ^22.13.11 specifier: ^22.13.11
version: 22.19.18 version: 22.19.18
packages/fastify:
dependencies:
'@fastify/autoload':
specifier: 6.3.1
version: 6.3.1
fastify:
specifier: 5.8.5
version: 5.8.5
site: site:
dependencies: dependencies:
'@mcflyjs/config': '@mcflyjs/config':
@ -164,7 +166,19 @@ importers:
version: 0.2.9 version: 0.2.9
'@mcflyjs/core': '@mcflyjs/core':
specifier: ^0.8.8 specifier: ^0.8.8
version: 0.8.8(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.0)(magicast@0.3.5) version: 0.8.8(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.4)(magicast@0.3.5)
test-core:
dependencies:
'@mcflyjs/config':
specifier: workspace:*
version: link:../packages/config
'@mcflyjs/core':
specifier: workspace:*
version: link:../packages/core
'@mcflyjs/fastify':
specifier: workspace:*
version: link:../packages/fastify
packages: packages:
@ -966,6 +980,9 @@ packages:
'@fastify/ajv-compiler@4.0.5': '@fastify/ajv-compiler@4.0.5':
resolution: {integrity: sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==} resolution: {integrity: sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A==}
'@fastify/autoload@6.3.1':
resolution: {integrity: sha512-0fsG+lO3m5yEZVjXKpltCe+2eHhM6rfAPQhvlGUgLUFTw/N2wA9WqPTObMtrF3oUCUrxbSDv60HlUIoh+aFM1A==}
'@fastify/busboy@3.2.0': '@fastify/busboy@3.2.0':
resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==} resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==}
@ -6853,6 +6870,8 @@ snapshots:
ajv-formats: 3.0.1(ajv@8.20.0) ajv-formats: 3.0.1(ajv@8.20.0)
fast-uri: 3.1.2 fast-uri: 3.1.2
'@fastify/autoload@6.3.1': {}
'@fastify/busboy@3.2.0': {} '@fastify/busboy@3.2.0': {}
'@fastify/error@4.2.0': {} '@fastify/error@4.2.0': {}
@ -7080,7 +7099,7 @@ snapshots:
h3: 1.15.11 h3: 1.15.11
web-component-base: 4.1.2 web-component-base: 4.1.2
'@mcflyjs/core@0.8.8(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.0)(magicast@0.3.5)': '@mcflyjs/core@0.8.8(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.4)(magicast@0.3.5)':
dependencies: dependencies:
c12: 3.3.4(magicast@0.3.5) c12: 3.3.4(magicast@0.3.5)
citty: 0.1.6 citty: 0.1.6
@ -7088,7 +7107,7 @@ snapshots:
devalue: 5.8.0 devalue: 5.8.0
esprima: 4.0.1 esprima: 4.0.1
h3: 1.15.11 h3: 1.15.11
nitropack: 2.11.13(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.0) nitropack: 2.11.13(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.4)
pathe: 2.0.3 pathe: 2.0.3
ultrahtml: 1.6.0 ultrahtml: 1.6.0
transitivePeerDependencies: transitivePeerDependencies:
@ -7166,23 +7185,23 @@ snapshots:
find-up: 7.0.0 find-up: 7.0.0
minimatch: 10.2.5 minimatch: 10.2.5
read-pkg: 9.0.1 read-pkg: 9.0.1
semver: 7.7.2 semver: 7.8.0
yaml: 2.8.4 yaml: 2.8.4
yargs: 17.7.2 yargs: 17.7.2
'@netlify/build@35.13.4(@opentelemetry/api@1.8.0)(@types/node@25.6.2)(picomatch@4.0.4)': '@netlify/build@35.13.4(@opentelemetry/api@1.8.0)(@types/node@25.6.2)(picomatch@4.0.4)(rollup@4.60.3)':
dependencies: dependencies:
'@bugsnag/js': 8.9.0 '@bugsnag/js': 8.9.0
'@netlify/blobs': 10.7.0(supports-color@10.2.2) '@netlify/blobs': 10.7.0(supports-color@10.2.2)
'@netlify/cache-utils': 6.0.5 '@netlify/cache-utils': 6.0.5
'@netlify/config': 24.5.0 '@netlify/config': 24.5.0
'@netlify/edge-bundler': 14.10.1 '@netlify/edge-bundler': 14.10.1
'@netlify/functions-utils': 6.2.30(supports-color@10.2.2) '@netlify/functions-utils': 6.2.30(rollup@4.60.3)(supports-color@10.2.2)
'@netlify/git-utils': 6.0.4 '@netlify/git-utils': 6.0.4
'@netlify/opentelemetry-utils': 2.0.2(@opentelemetry/api@1.8.0) '@netlify/opentelemetry-utils': 2.0.2(@opentelemetry/api@1.8.0)
'@netlify/plugins-list': 6.81.6 '@netlify/plugins-list': 6.81.6
'@netlify/run-utils': 6.0.3 '@netlify/run-utils': 6.0.3
'@netlify/zip-it-and-ship-it': 14.5.4(supports-color@10.2.2) '@netlify/zip-it-and-ship-it': 14.5.4(rollup@4.60.3)(supports-color@10.2.2)
'@opentelemetry/api': 1.8.0 '@opentelemetry/api': 1.8.0
'@sindresorhus/slugify': 2.2.1 '@sindresorhus/slugify': 2.2.1
ansi-escapes: 7.3.0 ansi-escapes: 7.3.0
@ -7215,7 +7234,7 @@ snapshots:
resolve: 2.0.0-next.6 resolve: 2.0.0-next.6
rfdc: 1.4.1 rfdc: 1.4.1
safe-json-stringify: 1.2.0 safe-json-stringify: 1.2.0
semver: 7.7.2 semver: 7.8.0
string-width: 7.2.0 string-width: 7.2.0
supports-color: 10.2.2 supports-color: 10.2.2
terminal-link: 4.0.0 terminal-link: 4.0.0
@ -7310,7 +7329,7 @@ snapshots:
image-size: 2.0.2 image-size: 2.0.2
js-image-generator: 1.0.4 js-image-generator: 1.0.4
parse-gitignore: 2.0.0 parse-gitignore: 2.0.0
semver: 7.7.2 semver: 7.8.0
tmp-promise: 3.0.3 tmp-promise: 3.0.3
uuid: 13.0.0 uuid: 13.0.0
write-file-atomic: 5.0.1 write-file-atomic: 5.0.1
@ -7328,12 +7347,12 @@ snapshots:
image-size: 2.0.2 image-size: 2.0.2
js-image-generator: 1.0.4 js-image-generator: 1.0.4
parse-gitignore: 2.0.0 parse-gitignore: 2.0.0
semver: 7.7.2 semver: 7.8.0
tmp-promise: 3.0.3 tmp-promise: 3.0.3
uuid: 13.0.0 uuid: 13.0.0
write-file-atomic: 5.0.1 write-file-atomic: 5.0.1
'@netlify/dev@4.17.3(db0@0.3.4(@electric-sql/pglite@0.3.16))(ioredis@5.10.1)': '@netlify/dev@4.17.3(db0@0.3.4(@electric-sql/pglite@0.3.16))(ioredis@5.10.1)(rollup@4.60.3)':
dependencies: dependencies:
'@netlify/ai': 0.4.1 '@netlify/ai': 0.4.1
'@netlify/blobs': 10.7.4 '@netlify/blobs': 10.7.4
@ -7341,7 +7360,7 @@ snapshots:
'@netlify/database-dev': 0.10.0 '@netlify/database-dev': 0.10.0
'@netlify/dev-utils': 4.4.3 '@netlify/dev-utils': 4.4.3
'@netlify/edge-functions-dev': 1.0.16 '@netlify/edge-functions-dev': 1.0.16
'@netlify/functions-dev': 1.2.6 '@netlify/functions-dev': 1.2.6(rollup@4.60.3)
'@netlify/headers': 2.1.8 '@netlify/headers': 2.1.8
'@netlify/images': 1.3.7(@netlify/blobs@10.7.4)(db0@0.3.4(@electric-sql/pglite@0.3.16))(ioredis@5.10.1) '@netlify/images': 1.3.7(@netlify/blobs@10.7.4)(db0@0.3.4(@electric-sql/pglite@0.3.16))(ioredis@5.10.1)
'@netlify/redirects': 3.1.10 '@netlify/redirects': 3.1.10
@ -7393,7 +7412,7 @@ snapshots:
p-wait-for: 5.0.2 p-wait-for: 5.0.2
parse-imports: 2.2.1 parse-imports: 2.2.1
path-key: 4.0.0 path-key: 4.0.0
semver: 7.7.2 semver: 7.8.0
tar: 7.5.15 tar: 7.5.15
tmp-promise: 3.0.3 tmp-promise: 3.0.3
urlpattern-polyfill: 8.0.2 urlpattern-polyfill: 8.0.2
@ -7416,12 +7435,12 @@ snapshots:
dependencies: dependencies:
'@netlify/types': 2.6.0 '@netlify/types': 2.6.0
'@netlify/functions-dev@1.2.6': '@netlify/functions-dev@1.2.6(rollup@4.60.3)':
dependencies: dependencies:
'@netlify/blobs': 10.7.4 '@netlify/blobs': 10.7.4
'@netlify/dev-utils': 4.4.3 '@netlify/dev-utils': 4.4.3
'@netlify/functions': 5.2.0 '@netlify/functions': 5.2.0
'@netlify/zip-it-and-ship-it': 14.5.4 '@netlify/zip-it-and-ship-it': 14.5.4(rollup@4.60.3)(supports-color@10.2.2)
cron-parser: 4.9.0 cron-parser: 4.9.0
decache: 4.6.2 decache: 4.6.2
extract-zip: 2.0.1 extract-zip: 2.0.1
@ -7429,7 +7448,7 @@ snapshots:
jwt-decode: 4.0.0 jwt-decode: 4.0.0
lambda-local: 2.2.0 lambda-local: 2.2.0
read-package-up: 11.0.0 read-package-up: 11.0.0
semver: 7.7.2 semver: 7.8.0
source-map-support: 0.5.21 source-map-support: 0.5.21
transitivePeerDependencies: transitivePeerDependencies:
- bare-abort-controller - bare-abort-controller
@ -7439,9 +7458,9 @@ snapshots:
- rollup - rollup
- supports-color - supports-color
'@netlify/functions-utils@6.2.30(supports-color@10.2.2)': '@netlify/functions-utils@6.2.30(rollup@4.60.3)(supports-color@10.2.2)':
dependencies: dependencies:
'@netlify/zip-it-and-ship-it': 14.5.4(supports-color@10.2.2) '@netlify/zip-it-and-ship-it': 14.5.4(rollup@4.60.3)(supports-color@10.2.2)
cpy: 11.1.0 cpy: 11.1.0
path-exists: 5.0.0 path-exists: 5.0.0
transitivePeerDependencies: transitivePeerDependencies:
@ -7669,7 +7688,7 @@ snapshots:
'@babel/types': 7.28.0 '@babel/types': 7.28.0
'@netlify/binary-info': 1.0.0 '@netlify/binary-info': 1.0.0
'@netlify/serverless-functions-api': 2.15.1 '@netlify/serverless-functions-api': 2.15.1
'@vercel/nft': 0.29.4(rollup@4.60.3) '@vercel/nft': 0.29.4(rollup@4.60.3)(supports-color@10.2.2)
archiver: 7.0.1 archiver: 7.0.1
common-path-prefix: 3.0.0 common-path-prefix: 3.0.0
copy-file: 11.1.0 copy-file: 11.1.0
@ -7706,13 +7725,13 @@ snapshots:
- rollup - rollup
- supports-color - supports-color
'@netlify/zip-it-and-ship-it@14.5.4': '@netlify/zip-it-and-ship-it@14.5.4(rollup@4.60.3)(supports-color@10.2.2)':
dependencies: dependencies:
'@babel/parser': 7.29.3 '@babel/parser': 7.29.3
'@babel/types': 7.29.0 '@babel/types': 7.29.0
'@netlify/binary-info': 1.0.0 '@netlify/binary-info': 1.0.0
'@netlify/serverless-functions-api': 2.15.0 '@netlify/serverless-functions-api': 2.15.0
'@vercel/nft': 0.29.4(rollup@4.60.3) '@vercel/nft': 0.29.4(rollup@4.60.3)(supports-color@10.2.2)
archiver: 7.0.1 archiver: 7.0.1
common-path-prefix: 3.0.0 common-path-prefix: 3.0.0
copy-file: 11.1.0 copy-file: 11.1.0
@ -7733,49 +7752,7 @@ snapshots:
precinct: 12.3.2(supports-color@10.2.2) precinct: 12.3.2(supports-color@10.2.2)
require-package-name: 2.0.1 require-package-name: 2.0.1
resolve: 2.0.0-next.6 resolve: 2.0.0-next.6
semver: 7.7.2 semver: 7.8.0
tmp-promise: 3.0.3
toml: 3.0.0
unixify: 1.0.0
urlpattern-polyfill: 8.0.2
yargs: 17.7.2
zod: 3.25.76
transitivePeerDependencies:
- bare-abort-controller
- bare-buffer
- encoding
- react-native-b4a
- rollup
- supports-color
'@netlify/zip-it-and-ship-it@14.5.4(supports-color@10.2.2)':
dependencies:
'@babel/parser': 7.29.3
'@babel/types': 7.29.0
'@netlify/binary-info': 1.0.0
'@netlify/serverless-functions-api': 2.15.0
'@vercel/nft': 0.29.4(supports-color@10.2.2)
archiver: 7.0.1
common-path-prefix: 3.0.0
copy-file: 11.1.0
es-module-lexer: 1.7.0
esbuild: 0.27.3
execa: 8.0.1
fast-glob: 3.3.3
filter-obj: 6.1.0
find-up: 7.0.0
is-path-inside: 4.0.0
junk: 4.0.1
locate-path: 7.2.0
merge-options: 3.0.4
minimatch: 10.2.5
normalize-path: 3.0.0
p-map: 7.0.3
path-exists: 5.0.0
precinct: 12.3.2(supports-color@10.2.2)
require-package-name: 2.0.1
resolve: 2.0.0-next.6
semver: 7.7.2
tmp-promise: 3.0.3 tmp-promise: 3.0.3
toml: 3.0.0 toml: 3.0.0
unixify: 1.0.0 unixify: 1.0.0
@ -7928,7 +7905,7 @@ snapshots:
'@opentelemetry/propagator-b3': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/propagator-b3': 1.30.1(@opentelemetry/api@1.9.0)
'@opentelemetry/propagator-jaeger': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/propagator-jaeger': 1.30.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0)
semver: 7.7.2 semver: 7.8.0
'@opentelemetry/semantic-conventions@1.28.0': {} '@opentelemetry/semantic-conventions@1.28.0': {}
@ -8292,26 +8269,7 @@ snapshots:
'@typescript-eslint/types': 8.59.2 '@typescript-eslint/types': 8.59.2
eslint-visitor-keys: 5.0.1 eslint-visitor-keys: 5.0.1
'@vercel/nft@0.29.4(rollup@4.60.3)': '@vercel/nft@0.29.4(rollup@4.60.3)(supports-color@10.2.2)':
dependencies:
'@mapbox/node-pre-gyp': 2.0.3(supports-color@10.2.2)
'@rollup/pluginutils': 5.3.0(rollup@4.60.3)
acorn: 8.16.0
acorn-import-attributes: 1.9.5(acorn@8.16.0)
async-sema: 3.1.1
bindings: 1.5.0
estree-walker: 2.0.2
glob: 10.5.0
graceful-fs: 4.2.11
node-gyp-build: 4.8.4
picomatch: 4.0.4
resolve-from: 5.0.0
transitivePeerDependencies:
- encoding
- rollup
- supports-color
'@vercel/nft@0.29.4(supports-color@10.2.2)':
dependencies: dependencies:
'@mapbox/node-pre-gyp': 2.0.3(supports-color@10.2.2) '@mapbox/node-pre-gyp': 2.0.3(supports-color@10.2.2)
'@rollup/pluginutils': 5.3.0(rollup@4.60.3) '@rollup/pluginutils': 5.3.0(rollup@4.60.3)
@ -9849,7 +9807,7 @@ snapshots:
process-warning: 5.0.0 process-warning: 5.0.0
rfdc: 1.4.1 rfdc: 1.4.1
secure-json-parse: 4.1.0 secure-json-parse: 4.1.0
semver: 7.7.2 semver: 7.8.0
toad-cache: 3.7.0 toad-cache: 3.7.0
fastq@1.20.1: fastq@1.20.1:
@ -10689,7 +10647,7 @@ snapshots:
lodash.isstring: 4.0.1 lodash.isstring: 4.0.1
lodash.once: 4.1.1 lodash.once: 4.1.1
ms: 2.1.3 ms: 2.1.3
semver: 7.7.2 semver: 7.8.0
junk@4.0.1: {} junk@4.0.1: {}
@ -11017,16 +10975,16 @@ snapshots:
negotiator@1.0.0: {} negotiator@1.0.0: {}
netlify-cli@25.6.2(@types/node@25.6.2)(db0@0.3.4(@electric-sql/pglite@0.3.16))(ioredis@5.10.1)(picomatch@4.0.4): netlify-cli@25.6.2(@types/node@25.6.2)(db0@0.3.4(@electric-sql/pglite@0.3.16))(ioredis@5.10.1)(picomatch@4.0.4)(rollup@4.60.3):
dependencies: dependencies:
'@fastify/static': 9.0.0 '@fastify/static': 9.0.0
'@netlify/ai': 0.4.1 '@netlify/ai': 0.4.1
'@netlify/api': 14.0.18 '@netlify/api': 14.0.18
'@netlify/blobs': 10.7.0(supports-color@10.2.2) '@netlify/blobs': 10.7.0(supports-color@10.2.2)
'@netlify/build': 35.13.4(@opentelemetry/api@1.8.0)(@types/node@25.6.2)(picomatch@4.0.4) '@netlify/build': 35.13.4(@opentelemetry/api@1.8.0)(@types/node@25.6.2)(picomatch@4.0.4)(rollup@4.60.3)
'@netlify/build-info': 10.5.1 '@netlify/build-info': 10.5.1
'@netlify/config': 24.5.0 '@netlify/config': 24.5.0
'@netlify/dev': 4.17.3(db0@0.3.4(@electric-sql/pglite@0.3.16))(ioredis@5.10.1) '@netlify/dev': 4.17.3(db0@0.3.4(@electric-sql/pglite@0.3.16))(ioredis@5.10.1)(rollup@4.60.3)
'@netlify/dev-utils': 4.4.3 '@netlify/dev-utils': 4.4.3
'@netlify/edge-bundler': 14.10.1 '@netlify/edge-bundler': 14.10.1
'@netlify/edge-functions': 3.0.6 '@netlify/edge-functions': 3.0.6
@ -11035,7 +10993,7 @@ snapshots:
'@netlify/images': 1.3.7(@netlify/blobs@10.7.0)(db0@0.3.4(@electric-sql/pglite@0.3.16))(ioredis@5.10.1) '@netlify/images': 1.3.7(@netlify/blobs@10.7.0)(db0@0.3.4(@electric-sql/pglite@0.3.16))(ioredis@5.10.1)
'@netlify/local-functions-proxy': 2.0.3 '@netlify/local-functions-proxy': 2.0.3
'@netlify/redirect-parser': 15.0.4 '@netlify/redirect-parser': 15.0.4
'@netlify/zip-it-and-ship-it': 14.5.4 '@netlify/zip-it-and-ship-it': 14.5.4(rollup@4.60.3)(supports-color@10.2.2)
'@octokit/rest': 22.0.0 '@octokit/rest': 22.0.0
'@opentelemetry/api': 1.8.0 '@opentelemetry/api': 1.8.0
'@pnpm/tabtab': 0.5.4 '@pnpm/tabtab': 0.5.4
@ -11162,110 +11120,6 @@ snapshots:
p-wait-for: 5.0.2 p-wait-for: 5.0.2
qs: 6.15.1 qs: 6.15.1
nitropack@2.11.13(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.0):
dependencies:
'@cloudflare/kv-asset-handler': 0.4.2
'@netlify/functions': 3.1.10(rollup@4.60.3)
'@rollup/plugin-alias': 5.1.1(rollup@4.60.3)
'@rollup/plugin-commonjs': 28.0.9(rollup@4.60.3)
'@rollup/plugin-inject': 5.0.5(rollup@4.60.3)
'@rollup/plugin-json': 6.1.0(rollup@4.60.3)
'@rollup/plugin-node-resolve': 16.0.3(rollup@4.60.3)
'@rollup/plugin-replace': 6.0.3(rollup@4.60.3)
'@rollup/plugin-terser': 0.4.4(rollup@4.60.3)
'@vercel/nft': 0.29.4(rollup@4.60.3)
archiver: 7.0.1
c12: 3.3.4(magicast@0.3.5)
chokidar: 4.0.3
citty: 0.1.6
compatx: 0.2.0
confbox: 0.2.4
consola: 3.4.2
cookie-es: 2.0.1
croner: 9.1.0
crossws: 0.3.5
db0: 0.3.4(@electric-sql/pglite@0.3.16)
defu: 6.1.7
destr: 2.0.5
dot-prop: 9.0.0
esbuild: 0.25.12
escape-string-regexp: 5.0.0
etag: 1.8.1
exsolve: 1.0.8
globby: 14.1.0
gzip-size: 7.0.0
h3: 1.15.11
hookable: 5.5.3
httpxy: 0.1.7
ioredis: 5.10.1
jiti: 2.7.0
klona: 2.0.6
knitwork: 1.3.0
listhen: 1.10.0
magic-string: 0.30.21
magicast: 0.3.5
mime: 4.1.0
mlly: 1.8.2
node-fetch-native: 1.6.7
node-mock-http: 1.0.4
ofetch: 1.5.1
ohash: 2.0.11
pathe: 2.0.3
perfect-debounce: 1.0.0
pkg-types: 2.3.1
pretty-bytes: 6.1.1
radix3: 1.1.2
rollup: 4.60.3
rollup-plugin-visualizer: 6.0.11(rollup@4.60.3)
scule: 1.3.0
semver: 7.8.0
serve-placeholder: 2.0.2
serve-static: 2.2.1
source-map: 0.7.6
std-env: 3.10.0
ufo: 1.6.4
ultrahtml: 1.6.0
uncrypto: 0.1.3
unctx: 2.5.0
unenv: 2.0.0-rc.24
unimport: 5.7.0
unplugin-utils: 0.2.5
unstorage: 1.17.5(@netlify/blobs@10.7.0)(db0@0.3.4(@electric-sql/pglite@0.3.16))(ioredis@5.10.1)
untyped: 2.0.0
unwasm: 0.3.11
youch: 4.1.0-beta.8
youch-core: 0.3.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/functions'
- '@vercel/kv'
- aws4fetch
- bare-abort-controller
- bare-buffer
- better-sqlite3
- drizzle-orm
- encoding
- idb-keyval
- mysql2
- react-native-b4a
- rolldown
- sqlite3
- supports-color
- uploadthing
nitropack@2.11.13(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.4): nitropack@2.11.13(@electric-sql/pglite@0.3.16)(@netlify/blobs@10.7.4):
dependencies: dependencies:
'@cloudflare/kv-asset-handler': 0.4.2 '@cloudflare/kv-asset-handler': 0.4.2
@ -11277,7 +11131,7 @@ snapshots:
'@rollup/plugin-node-resolve': 16.0.3(rollup@4.60.3) '@rollup/plugin-node-resolve': 16.0.3(rollup@4.60.3)
'@rollup/plugin-replace': 6.0.3(rollup@4.60.3) '@rollup/plugin-replace': 6.0.3(rollup@4.60.3)
'@rollup/plugin-terser': 0.4.4(rollup@4.60.3) '@rollup/plugin-terser': 0.4.4(rollup@4.60.3)
'@vercel/nft': 0.29.4(rollup@4.60.3) '@vercel/nft': 0.29.4(rollup@4.60.3)(supports-color@10.2.2)
archiver: 7.0.1 archiver: 7.0.1
c12: 3.3.4(magicast@0.3.5) c12: 3.3.4(magicast@0.3.5)
chokidar: 4.0.3 chokidar: 4.0.3
@ -11425,13 +11279,13 @@ snapshots:
normalize-package-data@7.0.1: normalize-package-data@7.0.1:
dependencies: dependencies:
hosted-git-info: 8.1.0 hosted-git-info: 8.1.0
semver: 7.7.2 semver: 7.8.0
validate-npm-package-license: 3.0.4 validate-npm-package-license: 3.0.4
normalize-package-data@8.0.0: normalize-package-data@8.0.0:
dependencies: dependencies:
hosted-git-info: 9.0.3 hosted-git-info: 9.0.3
semver: 7.7.2 semver: 7.8.0
validate-npm-package-license: 3.0.4 validate-npm-package-license: 3.0.4
normalize-path@2.1.1: normalize-path@2.1.1:
@ -11622,7 +11476,7 @@ snapshots:
ky: 1.14.3 ky: 1.14.3
registry-auth-token: 5.1.1 registry-auth-token: 5.1.1
registry-url: 6.0.1 registry-url: 6.0.1
semver: 7.7.2 semver: 7.8.0
parallel-transform@1.2.0: parallel-transform@1.2.0:
dependencies: dependencies:
@ -12916,7 +12770,7 @@ snapshots:
is-npm: 6.1.0 is-npm: 6.1.0
latest-version: 9.0.0 latest-version: 9.0.0
pupa: 3.3.0 pupa: 3.3.0
semver: 7.7.2 semver: 7.8.0
xdg-basedir: 5.1.0 xdg-basedir: 5.1.0
uqr@0.1.3: {} uqr@0.1.3: {}

View file

@ -1,7 +1,9 @@
packages: packages:
- "packages/**" - 'packages/**'
- "templates/**" - 'templates/**'
- "site/**" - 'site'
- 'test-fastify'
- 'test-core'
allowBuilds: allowBuilds:
'@parcel/watcher': false '@parcel/watcher': false
esbuild: true esbuild: true

View file

@ -1,27 +1,28 @@
// @ts-check // @ts-check
import { defineMcFlyConfig } from '@mcflyjs/config' import { defineConfig } from '@mcflyjs/config'
// import testPlugin from './test-plugin.mjs' // import testPlugin from './test-plugin.mjs'
export default defineMcFlyConfig({ export default defineConfig({
server: {},
components: 'js', components: 'js',
// plugins: [testPlugin()], // plugins: [testPlugin()],
nitro: { // nitro: {
preset: 'netlify', // preset: 'netlify',
devServer: { // devServer: {
watch: ['../packages'], // watch: ['../packages'],
}, // },
routeRules: { // routeRules: {
'/chat': { // '/chat': {
redirect: { // redirect: {
to: 'https://matrix.to/#/#mcfly:matrix.org', // to: 'https://matrix.to/#/#mcfly:matrix.org',
statusCode: 302, // statusCode: 302,
}, // },
}, // },
}, // },
compressPublicAssets: { // compressPublicAssets: {
gzip: true, // gzip: true,
brotli: true, // brotli: true,
}, // },
compatibilityDate: '2024-12-08', // compatibilityDate: '2024-12-08',
}, // },
}) })

View file

@ -0,0 +1,6 @@
import { defineConfig } from '@mcflyjs/config'
import fastify from '@mcflyjs/fastify'
export default defineConfig({
server: fastify(),
})

17
test-core/package.json Normal file
View file

@ -0,0 +1,17 @@
{
"name": "test-core",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "mcfly serve"
},
"author": "",
"license": "ISC",
"dependencies": {
"@mcflyjs/core": "workspace:*",
"@mcflyjs/config": "workspace:*",
"@mcflyjs/fastify": "workspace:*"
}
}

View file

@ -0,0 +1,29 @@
# Routes Folder
Routes define the pathways within your application.
Fastify's structure supports the modular monolith approach, where your
application is organized into distinct, self-contained modules.
This facilitates easier scaling and future transition to a microservice architecture.
In the future you might want to independently deploy some of those.
In this folder you should define all the routes that define the endpoints
of your web application.
Each service is a [Fastify
plugin](https://fastify.dev/docs/latest/Reference/Plugins/), it is
encapsulated (it can have its own independent plugins) and it is
typically stored in a file; be careful to group your routes logically,
e.g. all `/users` routes in a `users.js` file. We have added
a `root.js` file for you with a '/' root added.
If a single file becomes too large, create a folder and add a `index.js` file there:
this file must be a Fastify plugin, and it will be loaded automatically
by the application. You can now add as many files as you want inside that folder.
In this way you can create complex routes within a single monolith,
and eventually extract them.
If you need to share functionality between routes, place that
functionality into the `plugins` folder, and share it via
[decorators](https://fastify.dev/docs/latest/Reference/Decorators/).
If you're a bit confused about using `async/await` to write routes, you would
better take a look at [Promise resolution](https://fastify.dev/docs/latest/Reference/Routes/#promise-resolution) for more details.

View file

@ -0,0 +1,6 @@
export default async (fastify) => {
fastify.get('/', async function (request, reply) {
console.log({ request, reply })
return 'This is an example'
})
}

View file

@ -0,0 +1,6 @@
export default async function (fastify, opts) {
fastify.get('/', async function (request, reply) {
console.log({ opts, request, reply })
return { root: true }
})
}

View file