feat: move cli to core (#55)
* refactor: move cli to core * feat: move cli to core - use route-middleware in serve - eliminate need for `routes` dir in app * feat: use route-middleware in build * chore: update test gh action
This commit is contained in:
parent
f08ce4c043
commit
73617647db
31 changed files with 227 additions and 184 deletions
4
.github/workflows/test.yml
vendored
4
.github/workflows/test.yml
vendored
|
@ -21,8 +21,8 @@ jobs:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Install CLI deps
|
- name: Install core deps
|
||||||
run: cd packages/cli && npm install --ignore-scripts
|
run: cd packages/core && npm install --ignore-scripts
|
||||||
|
|
||||||
- name: Run CLI tests
|
- name: Run CLI tests
|
||||||
run: npx vitest run .
|
run: npx vitest run .
|
||||||
|
|
1
.vscode/settings.json
vendored
1
.vscode/settings.json
vendored
|
@ -5,6 +5,7 @@
|
||||||
"consola",
|
"consola",
|
||||||
"estree",
|
"estree",
|
||||||
"giget",
|
"giget",
|
||||||
|
"hookable",
|
||||||
"mcfly",
|
"mcfly",
|
||||||
"mcflyjs",
|
"mcflyjs",
|
||||||
"nitropack",
|
"nitropack",
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
"build:preview": "pnpm --filter @mcflyjs/landing-page build:preview",
|
"build:preview": "pnpm --filter @mcflyjs/landing-page build:preview",
|
||||||
"template:basic": "pnpm --filter @templates/basic dev",
|
"template:basic": "pnpm --filter @templates/basic dev",
|
||||||
"create": "node ./packages/create-mcfly",
|
"create": "node ./packages/create-mcfly",
|
||||||
"cli": "node ./packages/cli",
|
"cli": "node ./packages/core/cli/index.js",
|
||||||
"test": "vitest .",
|
"test": "vitest .",
|
||||||
"lint": "eslint . --config eslint.config.mjs --cache",
|
"lint": "eslint . --config eslint.config.mjs --cache",
|
||||||
"check": "npm run format && npm run lint",
|
"check": "npm run format && npm run lint",
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2023 Ayo Ayco
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
|
@ -1,27 +0,0 @@
|
||||||
# McFly CLI
|
|
||||||
|
|
||||||
The **McFly CLI** is the command-line tooling for [McFly](https://ayco.io/gh/McFly) -- a no-framework framework that assists in leveraging the web platform.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
Install the CLI using npm:
|
|
||||||
|
|
||||||
```
|
|
||||||
npm i -g @mcflyjs/cli
|
|
||||||
```
|
|
||||||
|
|
||||||
## Commands
|
|
||||||
|
|
||||||
You can run the following **McFly CLI** commands:
|
|
||||||
|
|
||||||
| Command | Action |
|
|
||||||
| --- | --- |
|
|
||||||
| `mcfly new` | Creates a new McFly project. |
|
|
||||||
| `mcfly serve` | Runs the developent server. |
|
|
||||||
| `mcfly build` | Builds the McFly project for production. |
|
|
||||||
| `mcfly prepare` | Prepares the McFly workspace. |
|
|
||||||
| `mcfly generate` | Generates building blocks for a McFly app. (In-progress) |
|
|
||||||
|
|
||||||
---
|
|
||||||
*Just keep building*<br />
|
|
||||||
*A project by [Ayo Ayco](https://ayco.io)*
|
|
|
@ -1,41 +0,0 @@
|
||||||
{
|
|
||||||
"name": "@mcflyjs/cli",
|
|
||||||
"version": "0.1.1",
|
|
||||||
"description": "McFly CLI tools",
|
|
||||||
"type": "module",
|
|
||||||
"main": "index.js",
|
|
||||||
"bin": {
|
|
||||||
"mcfly": "./index.js"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"version": "npm version",
|
|
||||||
"publish": "npm publish",
|
|
||||||
"test": "vitest",
|
|
||||||
"test:ui": "vitest --ui",
|
|
||||||
"test:coverage": "vitest run --coverage"
|
|
||||||
},
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/ayoayco/McFly.git",
|
|
||||||
"directory": "packages/cli"
|
|
||||||
},
|
|
||||||
"author": "Ayo Ayco",
|
|
||||||
"license": "MIT",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/ayoayco/McFly/issues"
|
|
||||||
},
|
|
||||||
"homepage": "https://mcfly.js.org",
|
|
||||||
"dependencies": {
|
|
||||||
"c12": "^2.0.1",
|
|
||||||
"citty": "^0.1.6",
|
|
||||||
"consola": "^3.3.3",
|
|
||||||
"pathe": "^1.1.2"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@vitest/coverage-istanbul": "2.1.8",
|
|
||||||
"@vitest/coverage-v8": "2.1.8",
|
|
||||||
"@vitest/ui": "2.1.8",
|
|
||||||
"nitropack": "~2.10.4",
|
|
||||||
"vitest": "^2.1.8"
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
import { test } from 'vitest'
|
|
||||||
import { exportedForTest } from '..'
|
|
||||||
import { expect } from 'vitest'
|
|
||||||
|
|
||||||
const testObj = exportedForTest.main
|
|
||||||
|
|
||||||
test('should have correct subcommands', () => {
|
|
||||||
Object.keys(testObj.subCommands).forEach((key) => {
|
|
||||||
expect(testObj.subCommands[key]).toBeTypeOf('function')
|
|
||||||
expect(testObj.subCommands[key].name).toBe(key)
|
|
||||||
})
|
|
||||||
})
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
import { consola } from 'consola'
|
import { consola } from 'consola'
|
||||||
import { defineCommand } from 'citty'
|
import { defineCommand } from 'citty'
|
||||||
import { resolve } from 'pathe'
|
import { dirname, resolve } from 'pathe'
|
||||||
import { loadConfig } from 'c12'
|
import { loadConfig } from 'c12'
|
||||||
import {
|
import {
|
||||||
build,
|
build,
|
||||||
|
@ -11,6 +11,7 @@ import {
|
||||||
prepare,
|
prepare,
|
||||||
prerender,
|
prerender,
|
||||||
} from 'nitropack'
|
} from 'nitropack'
|
||||||
|
import { fileURLToPath } from 'node:url'
|
||||||
|
|
||||||
async function _build(args) {
|
async function _build(args) {
|
||||||
consola.start('Building project...')
|
consola.start('Building project...')
|
||||||
|
@ -30,6 +31,15 @@ async function _build(args) {
|
||||||
...(nitroConfig ?? {}),
|
...(nitroConfig ?? {}),
|
||||||
})
|
})
|
||||||
nitro.options.runtimeConfig.mcfly = mcflyConfig
|
nitro.options.runtimeConfig.mcfly = mcflyConfig
|
||||||
|
|
||||||
|
const __filename = fileURLToPath(import.meta.url)
|
||||||
|
const __dirname = dirname(__filename)
|
||||||
|
|
||||||
|
nitro.options.handlers.push({
|
||||||
|
middleware: true,
|
||||||
|
handler: resolve(__dirname, '../../route-middleware.js'),
|
||||||
|
})
|
||||||
|
|
||||||
await prepare(nitro)
|
await prepare(nitro)
|
||||||
await copyPublicAssets(nitro)
|
await copyPublicAssets(nitro)
|
||||||
await prerender(nitro)
|
await prerender(nitro)
|
||||||
|
@ -42,7 +52,7 @@ async function _build(args) {
|
||||||
|
|
||||||
export default defineCommand({
|
export default defineCommand({
|
||||||
meta: {
|
meta: {
|
||||||
name: 'prepare',
|
name: 'build',
|
||||||
description: 'Builds the McFly project for production.',
|
description: 'Builds the McFly project for production.',
|
||||||
},
|
},
|
||||||
|
|
|
@ -9,7 +9,7 @@ function generate() {
|
||||||
|
|
||||||
export default defineCommand({
|
export default defineCommand({
|
||||||
meta: {
|
meta: {
|
||||||
name: 'prepare',
|
name: 'generate',
|
||||||
description: 'Generates building blocks for a McFly app.',
|
description: 'Generates building blocks for a McFly app.',
|
||||||
},
|
},
|
||||||
run() {
|
run() {
|
|
@ -18,7 +18,7 @@ function createNew(args) {
|
||||||
|
|
||||||
export default defineCommand({
|
export default defineCommand({
|
||||||
meta: {
|
meta: {
|
||||||
name: 'prepare',
|
name: 'new',
|
||||||
description: 'Creates a new McFly project.',
|
description: 'Creates a new McFly project.',
|
||||||
},
|
},
|
||||||
args: {
|
args: {
|
|
@ -13,8 +13,12 @@ import {
|
||||||
} from 'nitropack'
|
} from 'nitropack'
|
||||||
import { resolve } from 'pathe'
|
import { resolve } from 'pathe'
|
||||||
import { loadConfig } from 'c12'
|
import { loadConfig } from 'c12'
|
||||||
|
import { fileURLToPath } from 'node:url'
|
||||||
|
import { dirname } from 'pathe'
|
||||||
|
|
||||||
const hmrKeyRe = /^runtimeConfig\.|routeRules\./
|
const hmrKeyRe = /^runtimeConfig\.|routeRules\./
|
||||||
|
const __filename = fileURLToPath(import.meta.url)
|
||||||
|
const __dirname = dirname(__filename)
|
||||||
|
|
||||||
async function printInfo() {
|
async function printInfo() {
|
||||||
try {
|
try {
|
||||||
|
@ -91,7 +95,13 @@ async function serve(args) {
|
||||||
)
|
)
|
||||||
nitro.hooks.hookOnce('restart', reload)
|
nitro.hooks.hookOnce('restart', reload)
|
||||||
nitro.options.runtimeConfig.mcfly = mcflyConfig
|
nitro.options.runtimeConfig.mcfly = mcflyConfig
|
||||||
|
|
||||||
|
nitro.options.handlers.push({
|
||||||
|
middleware: true,
|
||||||
|
handler: resolve(__dirname, '../../route-middleware.js'),
|
||||||
|
})
|
||||||
const server = createDevServer(nitro)
|
const server = createDevServer(nitro)
|
||||||
|
|
||||||
// const listenOptions = parseArgs(args)
|
// const listenOptions = parseArgs(args)
|
||||||
await server.listen(1234)
|
await server.listen(1234)
|
||||||
await prepare(nitro)
|
await prepare(nitro)
|
||||||
|
@ -106,7 +116,7 @@ async function serve(args) {
|
||||||
|
|
||||||
export default defineCommand({
|
export default defineCommand({
|
||||||
meta: {
|
meta: {
|
||||||
name: 'prepare',
|
name: 'serve',
|
||||||
description: 'Runs the dev server.',
|
description: 'Runs the dev server.',
|
||||||
},
|
},
|
||||||
async run({ args }) {
|
async run({ args }) {
|
|
@ -1,11 +1,11 @@
|
||||||
import { consola } from 'consola'
|
import { consola } from 'consola'
|
||||||
import { eventHandler } from 'h3'
|
import { eventHandler } from 'h3'
|
||||||
import { createHooks } from 'hookable'
|
import { createHooks } from 'hookable'
|
||||||
import { hooks as mcflyHooks } from './hooks.js'
|
import { hooks as mcflyHooks } from './hooks.mjs'
|
||||||
import { evaluateServerScripts } from './evaluate-scripts.js'
|
import { evaluateServerScripts } from './evaluate-scripts.mjs'
|
||||||
import { injectHtmlFragments } from './inject-fragments.js'
|
import { injectHtmlFragments } from './inject-fragments.mjs'
|
||||||
import { injectCustomElements } from './inject-elements.js'
|
import { injectCustomElements } from './inject-elements.mjs'
|
||||||
import defaultMcflyConfig from './default-mcfly-config.js'
|
import defaultMcflyConfig from './default-mcfly-config.mjs'
|
||||||
import { loadConfig } from 'c12'
|
import { loadConfig } from 'c12'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -17,16 +17,16 @@ import { loadConfig } from 'c12'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Intercepts all routes and assembles the correct HTML to return
|
* Intercepts all routes and assembles the correct HTML to return
|
||||||
|
* @deprecated
|
||||||
* @param {{
|
* @param {{
|
||||||
* storage: Storage
|
* storage: Storage
|
||||||
* }} param0
|
* }} param0
|
||||||
* @returns {EventHandler}
|
* @returns {EventHandler}
|
||||||
*/
|
*/
|
||||||
export function useMcFlyRoute({ storage }) {
|
export function useMcFlyRoute({ storage }) {
|
||||||
const hooks = createHooks()
|
|
||||||
Object.keys(mcflyHooks).forEach((hookName) => hooks.addHooks(hookName))
|
|
||||||
|
|
||||||
return eventHandler(async (event) => {
|
return eventHandler(async (event) => {
|
||||||
|
const hooks = createHooks()
|
||||||
|
Object.keys(mcflyHooks).forEach((hookName) => hooks.addHooks(hookName))
|
||||||
const { path } = event
|
const { path } = event
|
||||||
let { config } = await loadConfig({ name: 'mcfly' })
|
let { config } = await loadConfig({ name: 'mcfly' })
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import { ELEMENT_NODE, parse, render, walkSync } from 'ultrahtml'
|
import { ELEMENT_NODE, parse, render, walkSync } from 'ultrahtml'
|
||||||
import { getFiles } from './get-files.js'
|
import { getFiles } from './get-files.mjs'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef {import('../config').McFlyConfig} Config
|
* @typedef {import('../config/index.js').McFlyConfig} Config
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -1,5 +1,5 @@
|
||||||
import { ELEMENT_NODE, parse, render, walkSync } from 'ultrahtml'
|
import { ELEMENT_NODE, parse, render, walkSync } from 'ultrahtml'
|
||||||
import { getFiles } from './get-files.js'
|
import { getFiles } from './get-files.mjs'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef {import('ultrahtml').Node} HtmlNode
|
* @typedef {import('ultrahtml').Node} HtmlNode
|
|
@ -1,13 +1,17 @@
|
||||||
{
|
{
|
||||||
"name": "@mcflyjs/core",
|
"name": "@mcflyjs/core",
|
||||||
"version": "0.6.2",
|
"version": "0.7.0",
|
||||||
"description": "McFly core package",
|
"description": "McFly core package",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
|
"bin": {
|
||||||
|
"mcfly": "./cli/index.js"
|
||||||
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"version": "npm version",
|
"version": "npm version",
|
||||||
"publish": "npm publish",
|
"publish": "npm publish",
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"test": "echo \"Error: no test specified\" && exit 1",
|
||||||
|
"build:middleware": "npx esbuild route-middleware.js --bundle --outfile=mcfly-middleware.js"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
@ -22,8 +26,8 @@
|
||||||
"homepage": "https://mcfly.js.org",
|
"homepage": "https://mcfly.js.org",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"c12": "^2.0.1",
|
"c12": "^2.0.1",
|
||||||
|
"citty": "^0.1.6",
|
||||||
"consola": "^3.3.3",
|
"consola": "^3.3.3",
|
||||||
"esbuild": "^0.24.2",
|
|
||||||
"esprima": "^4.0.1",
|
"esprima": "^4.0.1",
|
||||||
"h3": "^1.13.0",
|
"h3": "^1.13.0",
|
||||||
"nitropack": "latest",
|
"nitropack": "latest",
|
||||||
|
@ -31,7 +35,12 @@
|
||||||
"ultrahtml": "^1.5.3"
|
"ultrahtml": "^1.5.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@vitest/coverage-istanbul": "2.1.8",
|
||||||
|
"@vitest/coverage-v8": "2.1.8",
|
||||||
|
"@vitest/ui": "2.1.8",
|
||||||
|
"esbuild": "^0.24.2",
|
||||||
"hookable": "^5.5.3",
|
"hookable": "^5.5.3",
|
||||||
"unstorage": "^1.14.4"
|
"unstorage": "^1.14.4",
|
||||||
|
"vitest": "^2.1.8"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
124
packages/core/route-middleware.js
Normal file
124
packages/core/route-middleware.js
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
import { eventHandler } from 'h3'
|
||||||
|
import { useRuntimeConfig, useStorage } from 'nitropack/runtime'
|
||||||
|
import { createHooks } from 'hookable'
|
||||||
|
import { consola } from 'consola'
|
||||||
|
|
||||||
|
import { hooks as mcflyHooks } from '@mcflyjs/core/hooks.mjs'
|
||||||
|
import defaultMcflyConfig from '@mcflyjs/core/default-mcfly-config.mjs'
|
||||||
|
import { evaluateServerScripts } from '@mcflyjs/core/evaluate-scripts.mjs'
|
||||||
|
import { injectHtmlFragments } from '@mcflyjs/core/inject-fragments.mjs'
|
||||||
|
import { injectCustomElements } from '@mcflyjs/core/inject-elements.mjs'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @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 hooks = createHooks()
|
||||||
|
Object.keys(mcflyHooks).forEach((hookName) => hooks.addHooks(hookName))
|
||||||
|
const { path } = event
|
||||||
|
let { mcfly: config } = useRuntimeConfig()
|
||||||
|
const storage = useStorage()
|
||||||
|
|
||||||
|
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 }
|
||||||
|
)
|
||||||
|
)
|
||||||
|
})
|
||||||
|
/**
|
||||||
|
* 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
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
import consola from 'consola'
|
import consola from 'consola'
|
||||||
import { vi, expect, test } from 'vitest'
|
import { vi, expect, test } from 'vitest'
|
||||||
import { exportedForTest } from '../commands/build.mjs'
|
import { exportedForTest } from '../cli/commands/build.mjs'
|
||||||
|
|
||||||
const testFn = exportedForTest.build
|
const testFn = exportedForTest.build
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { expect, test, vi } from 'vitest'
|
import { expect, test, vi } from 'vitest'
|
||||||
import { exportedForTest } from '../commands/generate.mjs'
|
import { exportedForTest } from '../cli/commands/generate.mjs'
|
||||||
import consola from 'consola'
|
import consola from 'consola'
|
||||||
|
|
||||||
const testFn = exportedForTest.generate
|
const testFn = exportedForTest.generate
|
|
@ -1,5 +1,5 @@
|
||||||
import { expect, test, vi } from 'vitest'
|
import { expect, test, vi } from 'vitest'
|
||||||
import { exportedForTest } from '../commands/new.mjs'
|
import { exportedForTest } from '../cli/commands/new.mjs'
|
||||||
import { execSync } from 'node:child_process'
|
import { execSync } from 'node:child_process'
|
||||||
import consola from 'consola'
|
import consola from 'consola'
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { test, expect, vi } from 'vitest'
|
import { test, expect, vi } from 'vitest'
|
||||||
import { exportedForTest } from '../commands/prepare.mjs'
|
import { exportedForTest } from '../cli/commands/prepare.mjs'
|
||||||
import consola from 'consola'
|
import consola from 'consola'
|
||||||
import { execSync } from 'node:child_process'
|
import { execSync } from 'node:child_process'
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { describe, expect, test, vi } from 'vitest'
|
import { describe, expect, test, vi } from 'vitest'
|
||||||
import { exportedForTest } from '../commands/serve.mjs'
|
import { exportedForTest } from '../cli/commands/serve.mjs'
|
||||||
import consola from 'consola'
|
import consola from 'consola'
|
||||||
|
|
||||||
// describe.skip('FUNCTION: serve()', () => {
|
// describe.skip('FUNCTION: serve()', () => {
|
|
@ -36,37 +36,6 @@ importers:
|
||||||
specifier: ^2.1.8
|
specifier: ^2.1.8
|
||||||
version: 2.1.8(@types/node@22.10.2)(@vitest/ui@2.1.8)(terser@5.37.0)
|
version: 2.1.8(@types/node@22.10.2)(@vitest/ui@2.1.8)(terser@5.37.0)
|
||||||
|
|
||||||
packages/cli:
|
|
||||||
dependencies:
|
|
||||||
c12:
|
|
||||||
specifier: ^2.0.1
|
|
||||||
version: 2.0.1(magicast@0.3.5)
|
|
||||||
citty:
|
|
||||||
specifier: ^0.1.6
|
|
||||||
version: 0.1.6
|
|
||||||
consola:
|
|
||||||
specifier: ^3.3.3
|
|
||||||
version: 3.3.3
|
|
||||||
pathe:
|
|
||||||
specifier: ^1.1.2
|
|
||||||
version: 1.1.2
|
|
||||||
devDependencies:
|
|
||||||
'@vitest/coverage-istanbul':
|
|
||||||
specifier: 2.1.8
|
|
||||||
version: 2.1.8(vitest@2.1.8)
|
|
||||||
'@vitest/coverage-v8':
|
|
||||||
specifier: 2.1.8
|
|
||||||
version: 2.1.8(vitest@2.1.8)
|
|
||||||
'@vitest/ui':
|
|
||||||
specifier: 2.1.8
|
|
||||||
version: 2.1.8(vitest@2.1.8)
|
|
||||||
nitropack:
|
|
||||||
specifier: ~2.10.4
|
|
||||||
version: 2.10.4(typescript@5.7.2)
|
|
||||||
vitest:
|
|
||||||
specifier: ^2.1.8
|
|
||||||
version: 2.1.8(@types/node@22.10.2)(@vitest/ui@2.1.8)(terser@5.37.0)
|
|
||||||
|
|
||||||
packages/config:
|
packages/config:
|
||||||
dependencies:
|
dependencies:
|
||||||
h3:
|
h3:
|
||||||
|
@ -85,12 +54,12 @@ importers:
|
||||||
c12:
|
c12:
|
||||||
specifier: ^2.0.1
|
specifier: ^2.0.1
|
||||||
version: 2.0.1(magicast@0.3.5)
|
version: 2.0.1(magicast@0.3.5)
|
||||||
|
citty:
|
||||||
|
specifier: ^0.1.6
|
||||||
|
version: 0.1.6
|
||||||
consola:
|
consola:
|
||||||
specifier: ^3.3.3
|
specifier: ^3.3.3
|
||||||
version: 3.3.3
|
version: 3.3.3
|
||||||
esbuild:
|
|
||||||
specifier: ^0.24.2
|
|
||||||
version: 0.24.2
|
|
||||||
esprima:
|
esprima:
|
||||||
specifier: ^4.0.1
|
specifier: ^4.0.1
|
||||||
version: 4.0.1
|
version: 4.0.1
|
||||||
|
@ -107,12 +76,27 @@ importers:
|
||||||
specifier: ^1.5.3
|
specifier: ^1.5.3
|
||||||
version: 1.5.3
|
version: 1.5.3
|
||||||
devDependencies:
|
devDependencies:
|
||||||
|
'@vitest/coverage-istanbul':
|
||||||
|
specifier: 2.1.8
|
||||||
|
version: 2.1.8(vitest@2.1.8)
|
||||||
|
'@vitest/coverage-v8':
|
||||||
|
specifier: 2.1.8
|
||||||
|
version: 2.1.8(vitest@2.1.8)
|
||||||
|
'@vitest/ui':
|
||||||
|
specifier: 2.1.8
|
||||||
|
version: 2.1.8(vitest@2.1.8)
|
||||||
|
esbuild:
|
||||||
|
specifier: ^0.24.2
|
||||||
|
version: 0.24.2
|
||||||
hookable:
|
hookable:
|
||||||
specifier: ^5.5.3
|
specifier: ^5.5.3
|
||||||
version: 5.5.3
|
version: 5.5.3
|
||||||
unstorage:
|
unstorage:
|
||||||
specifier: ^1.14.4
|
specifier: ^1.14.4
|
||||||
version: 1.14.4(db0@0.2.1)(ioredis@5.4.2)
|
version: 1.14.4(db0@0.2.1)(ioredis@5.4.2)
|
||||||
|
vitest:
|
||||||
|
specifier: ^2.1.8
|
||||||
|
version: 2.1.8(@types/node@22.10.2)(@vitest/ui@2.1.8)(terser@5.37.0)
|
||||||
|
|
||||||
packages/create-mcfly:
|
packages/create-mcfly:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -125,9 +109,6 @@ importers:
|
||||||
|
|
||||||
site:
|
site:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@mcflyjs/cli':
|
|
||||||
specifier: workspace:*
|
|
||||||
version: link:../packages/cli
|
|
||||||
'@mcflyjs/config':
|
'@mcflyjs/config':
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../packages/config
|
version: link:../packages/config
|
||||||
|
@ -139,7 +120,7 @@ importers:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@mcflyjs/cli':
|
'@mcflyjs/cli':
|
||||||
specifier: ^0.1.1
|
specifier: ^0.1.1
|
||||||
version: link:../../packages/cli
|
version: 0.1.1(magicast@0.3.5)
|
||||||
'@mcflyjs/config':
|
'@mcflyjs/config':
|
||||||
specifier: ^0.2.1
|
specifier: ^0.2.1
|
||||||
version: link:../../packages/config
|
version: link:../../packages/config
|
||||||
|
@ -622,6 +603,10 @@ packages:
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
'@mcflyjs/cli@0.1.1':
|
||||||
|
resolution: {integrity: sha512-YT0XVwbUO9SscfoCrNY1Tz92SwLrCKbvHYrPUWjC8UAVaaX8tekdfRDF7DiIr8PX5me3YIZUBnQw0/loFNPhvQ==}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
'@mcflyjs/core@0.6.1':
|
'@mcflyjs/core@0.6.1':
|
||||||
resolution: {integrity: sha512-ozgpIRpNix7gyuFlB8ofEm+iENMvxQsgyzxMTbIrOM69QYiEV1GsjxWyUqH3QuCwA4UB1KHdyWS+PNaCWSepOQ==}
|
resolution: {integrity: sha512-ozgpIRpNix7gyuFlB8ofEm+iENMvxQsgyzxMTbIrOM69QYiEV1GsjxWyUqH3QuCwA4UB1KHdyWS+PNaCWSepOQ==}
|
||||||
|
|
||||||
|
@ -3132,6 +3117,15 @@ snapshots:
|
||||||
- encoding
|
- encoding
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
'@mcflyjs/cli@0.1.1(magicast@0.3.5)':
|
||||||
|
dependencies:
|
||||||
|
c12: 2.0.1(magicast@0.3.5)
|
||||||
|
citty: 0.1.6
|
||||||
|
consola: 3.3.3
|
||||||
|
pathe: 1.1.2
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- magicast
|
||||||
|
|
||||||
'@mcflyjs/core@0.6.1(magicast@0.3.5)(typescript@5.7.2)':
|
'@mcflyjs/core@0.6.1(magicast@0.3.5)(typescript@5.7.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
c12: 2.0.1(magicast@0.3.5)
|
c12: 2.0.1(magicast@0.3.5)
|
||||||
|
|
|
@ -2,19 +2,6 @@
|
||||||
"name": "@mcflyjs/landing-page",
|
"name": "@mcflyjs/landing-page",
|
||||||
"description": "McFly is a full-stack no-framework framework that assists developers in leveraging the web platform.",
|
"description": "McFly is a full-stack no-framework framework that assists developers in leveraging the web platform.",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
|
||||||
"start": "mcfly serve",
|
|
||||||
"prepare": "mcfly prepare",
|
|
||||||
"dev": "mcfly serve",
|
|
||||||
"build": "mcfly build",
|
|
||||||
"preview": "node .output/server/index.mjs",
|
|
||||||
"build:preview": "pnpm run build && pnpm run preview"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@mcflyjs/cli": "workspace:*",
|
|
||||||
"@mcflyjs/config": "workspace:*",
|
|
||||||
"@mcflyjs/core": "workspace:*"
|
|
||||||
},
|
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -27,5 +14,17 @@
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/ayoayco/McFly/issues"
|
"url": "https://github.com/ayoayco/McFly/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://mcfly.js.org"
|
"homepage": "https://mcfly.js.org",
|
||||||
|
"scripts": {
|
||||||
|
"start": "mcfly serve",
|
||||||
|
"prepare": "mcfly prepare",
|
||||||
|
"dev": "mcfly serve",
|
||||||
|
"build": "mcfly build",
|
||||||
|
"preview": "node .output/server/index.mjs",
|
||||||
|
"build:preview": "pnpm run build && pnpm run preview"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@mcflyjs/config": "workspace:*",
|
||||||
|
"@mcflyjs/core": "workspace:*"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
import { useMcFlyRoute } from '@mcflyjs/core'
|
|
||||||
|
|
||||||
export default useMcFlyRoute({ storage: useStorage() })
|
|
Loading…
Reference in a new issue