mirror of
https://github.com/nuxt/nuxt.git
synced 2024-11-11 08:33:53 +00:00
feat(nitro): storage support (#76)
This commit is contained in:
parent
2d60e71fcb
commit
31f06e9f69
@ -60,6 +60,7 @@
|
|||||||
"std-env": "^2.3.0",
|
"std-env": "^2.3.0",
|
||||||
"table": "^6.0.9",
|
"table": "^6.0.9",
|
||||||
"ufo": "^0.6.11",
|
"ufo": "^0.6.11",
|
||||||
|
"unstorage": "^0.1.2",
|
||||||
"upath": "^2.0.1",
|
"upath": "^2.0.1",
|
||||||
"vue": "3.0.11",
|
"vue": "3.0.11",
|
||||||
"vue-bundle-renderer": "^0.2.3",
|
"vue-bundle-renderer": "^0.2.3",
|
||||||
|
@ -6,6 +6,7 @@ import type { Preset } from '@nuxt/un'
|
|||||||
import { tryImport, resolvePath, detectTarget, extendPreset } from './utils'
|
import { tryImport, resolvePath, detectTarget, extendPreset } from './utils'
|
||||||
import * as PRESETS from './presets'
|
import * as PRESETS from './presets'
|
||||||
import type { NodeExternalsOptions } from './rollup/plugins/externals'
|
import type { NodeExternalsOptions } from './rollup/plugins/externals'
|
||||||
|
import type { StorageOptions } from './rollup/plugins/storage'
|
||||||
import type { ServerMiddleware } from './server/middleware'
|
import type { ServerMiddleware } from './server/middleware'
|
||||||
|
|
||||||
export interface NitroContext {
|
export interface NitroContext {
|
||||||
@ -32,6 +33,7 @@ export interface NitroContext {
|
|||||||
serverDir: string
|
serverDir: string
|
||||||
publicDir: string
|
publicDir: string
|
||||||
}
|
}
|
||||||
|
storage: StorageOptions,
|
||||||
_nuxt: {
|
_nuxt: {
|
||||||
majorVersion: number
|
majorVersion: number
|
||||||
dev: boolean
|
dev: boolean
|
||||||
@ -85,6 +87,7 @@ export function getNitroContext (nuxtOptions: NuxtOptions, input: NitroInput): N
|
|||||||
serverDir: '{{ output.dir }}/server',
|
serverDir: '{{ output.dir }}/server',
|
||||||
publicDir: '{{ output.dir }}/public'
|
publicDir: '{{ output.dir }}/public'
|
||||||
},
|
},
|
||||||
|
storage: { mounts: { } },
|
||||||
_nuxt: {
|
_nuxt: {
|
||||||
majorVersion: nuxtOptions._majorVersion || 2,
|
majorVersion: nuxtOptions._majorVersion || 2,
|
||||||
dev: nuxtOptions.dev,
|
dev: nuxtOptions.dev,
|
||||||
@ -129,6 +132,22 @@ export function getNitroContext (nuxtOptions: NuxtOptions, input: NitroInput): N
|
|||||||
|
|
||||||
nitroContext._internal.hooks.addHooks(nitroContext.hooks)
|
nitroContext._internal.hooks.addHooks(nitroContext.hooks)
|
||||||
|
|
||||||
|
// Dev-only storage
|
||||||
|
if (nitroContext._nuxt.dev) {
|
||||||
|
const fsMounts = {
|
||||||
|
root: resolve(nitroContext._nuxt.rootDir),
|
||||||
|
src: resolve(nitroContext._nuxt.srcDir),
|
||||||
|
build: resolve(nitroContext._nuxt.buildDir),
|
||||||
|
cache: resolve(nitroContext._nuxt.rootDir, '.nuxt/nitro/cache')
|
||||||
|
}
|
||||||
|
for (const p in fsMounts) {
|
||||||
|
nitroContext.storage.mounts[p] = nitroContext.storage.mounts[p] || {
|
||||||
|
driver: 'fs',
|
||||||
|
driverOptions: { base: fsMounts[p] }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// console.log(nitroContext)
|
// console.log(nitroContext)
|
||||||
// process.exit(1)
|
// process.exit(1)
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@ import { staticAssets, dirnames } from './plugins/static'
|
|||||||
import { middleware } from './plugins/middleware'
|
import { middleware } from './plugins/middleware'
|
||||||
import { esbuild } from './plugins/esbuild'
|
import { esbuild } from './plugins/esbuild'
|
||||||
import { raw } from './plugins/raw'
|
import { raw } from './plugins/raw'
|
||||||
|
import { storage } from './plugins/storage'
|
||||||
|
|
||||||
export type RollupConfig = InputOptions & { output: OutputOptions }
|
export type RollupConfig = InputOptions & { output: OutputOptions }
|
||||||
|
|
||||||
@ -153,6 +154,9 @@ export const getRollupConfig = (nitroContext: NitroContext) => {
|
|||||||
rollupConfig.plugins.push(staticAssets(nitroContext))
|
rollupConfig.plugins.push(staticAssets(nitroContext))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Storage
|
||||||
|
rollupConfig.plugins.push(storage(nitroContext.storage))
|
||||||
|
|
||||||
// Middleware
|
// Middleware
|
||||||
rollupConfig.plugins.push(middleware(() => {
|
rollupConfig.plugins.push(middleware(() => {
|
||||||
const _middleware = [
|
const _middleware = [
|
||||||
|
46
packages/nitro/src/rollup/plugins/storage.ts
Normal file
46
packages/nitro/src/rollup/plugins/storage.ts
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
import virtual from '@rollup/plugin-virtual'
|
||||||
|
|
||||||
|
export interface StorageOptions {
|
||||||
|
mounts: {
|
||||||
|
[path: string]: {
|
||||||
|
driver: 'fs' | 'http' | 'memory',
|
||||||
|
driverOptions?: Record<string, any>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const drivers = {
|
||||||
|
fs: 'unstorage/drivers/fs',
|
||||||
|
http: 'unstorage/drivers/http',
|
||||||
|
memory: 'unstorage/drivers/memory'
|
||||||
|
}
|
||||||
|
|
||||||
|
export function storage (opts: StorageOptions) {
|
||||||
|
const mounts: { path: string, driver: string, opts: object }[] = []
|
||||||
|
|
||||||
|
for (const path in opts.mounts) {
|
||||||
|
const mount = opts.mounts[path]
|
||||||
|
mounts.push({
|
||||||
|
path,
|
||||||
|
driver: drivers[mount.driver] || mount.driver,
|
||||||
|
opts: mount.driverOptions || {}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const driverImports = Array.from(new Set(mounts.map(m => m.driver)))
|
||||||
|
|
||||||
|
return virtual({
|
||||||
|
'~nitro/storage': `
|
||||||
|
import { createStorage } from 'unstorage'
|
||||||
|
${driverImports.map(i => `import ${getImportName(i)} from '${i}'`).join('\n')}
|
||||||
|
|
||||||
|
export const storage = createStorage({})
|
||||||
|
|
||||||
|
${mounts.map(m => `storage.mount('${m.path}', ${getImportName(m.driver)}(${JSON.stringify(m.opts)}))`).join('\n')}
|
||||||
|
`
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function getImportName (id: string) {
|
||||||
|
return '_' + id.replace(/[\\/.]/g, '_')
|
||||||
|
}
|
61
yarn.lock
61
yarn.lock
@ -1704,6 +1704,7 @@ __metadata:
|
|||||||
table: ^6.0.9
|
table: ^6.0.9
|
||||||
ufo: ^0.6.11
|
ufo: ^0.6.11
|
||||||
unbuild: ^0.1.12
|
unbuild: ^0.1.12
|
||||||
|
unstorage: ^0.1.2
|
||||||
upath: ^2.0.1
|
upath: ^2.0.1
|
||||||
vue: 3.0.11
|
vue: 3.0.11
|
||||||
vue-bundle-renderer: ^0.2.3
|
vue-bundle-renderer: ^0.2.3
|
||||||
@ -3301,7 +3302,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"anymatch@npm:^3.0.3, anymatch@npm:~3.1.1":
|
"anymatch@npm:^3.0.3, anymatch@npm:^3.1.1, anymatch@npm:~3.1.1":
|
||||||
version: 3.1.2
|
version: 3.1.2
|
||||||
resolution: "anymatch@npm:3.1.2"
|
resolution: "anymatch@npm:3.1.2"
|
||||||
dependencies:
|
dependencies:
|
||||||
@ -6829,7 +6830,7 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"h3@npm:^0.2.9":
|
"h3@npm:^0.2.5, h3@npm:^0.2.9":
|
||||||
version: 0.2.9
|
version: 0.2.9
|
||||||
resolution: "h3@npm:0.2.9"
|
resolution: "h3@npm:0.2.9"
|
||||||
checksum: 8249aa37f0938b8b18d06818179b32a8fa5d29806c2ebe8c1bb483397776c377dde4d3c2c371b56ba1253e06d54528339a63fce8b3aa2707e796d4c1f1ab48a7
|
checksum: 8249aa37f0938b8b18d06818179b32a8fa5d29806c2ebe8c1bb483397776c377dde4d3c2c371b56ba1253e06d54528339a63fce8b3aa2707e796d4c1f1ab48a7
|
||||||
@ -8755,6 +8756,23 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"listhen@npm:^0.1.4":
|
||||||
|
version: 0.1.4
|
||||||
|
resolution: "listhen@npm:0.1.4"
|
||||||
|
dependencies:
|
||||||
|
chalk: ^4.1.0
|
||||||
|
clipboardy: ^2.3.0
|
||||||
|
defu: ^3.2.2
|
||||||
|
get-port-please: ^2.1.0
|
||||||
|
http-shutdown: ^1.2.2
|
||||||
|
ohmyfetch: ^0.1.8
|
||||||
|
open: ^7.3.0
|
||||||
|
selfsigned: ^1.10.8
|
||||||
|
ufo: ^0.6.6
|
||||||
|
checksum: ce3d3a9c46afd77282364af0eb5ec584a72e40fa27ae111393a9c8110192e5bf5efd1afb941433d4907dd2f6d2f3499d2311280ec3271c9091b2ac7c276bc79a
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"listhen@npm:^0.2.3":
|
"listhen@npm:^0.2.3":
|
||||||
version: 0.2.3
|
version: 0.2.3
|
||||||
resolution: "listhen@npm:0.2.3"
|
resolution: "listhen@npm:0.2.3"
|
||||||
@ -10175,6 +10193,15 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"ohmyfetch@npm:^0.1.8":
|
||||||
|
version: 0.1.8
|
||||||
|
resolution: "ohmyfetch@npm:0.1.8"
|
||||||
|
dependencies:
|
||||||
|
node-fetch: ^2.6.1
|
||||||
|
checksum: 3bc6d541107a3ae7087a9c41b88f731706da96f01d339cceb51c69a0328578c1f362e69da7dfb98dc0d55cd4d09b061418bf2eaa644074b2f4e0db7cc099a63e
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"ohmyfetch@npm:^0.2.0":
|
"ohmyfetch@npm:^0.2.0":
|
||||||
version: 0.2.0
|
version: 0.2.0
|
||||||
resolution: "ohmyfetch@npm:0.2.0"
|
resolution: "ohmyfetch@npm:0.2.0"
|
||||||
@ -10213,6 +10240,16 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"open@npm:^7.3.0":
|
||||||
|
version: 7.4.2
|
||||||
|
resolution: "open@npm:7.4.2"
|
||||||
|
dependencies:
|
||||||
|
is-docker: ^2.0.0
|
||||||
|
is-wsl: ^2.1.1
|
||||||
|
checksum: 07545fa768e5fbc25c6f53c6f17465f1b7ee663a494f87608d99a7b3227c83d2d2e0f0e5ecb70325b4ddef97dcd02d206f9afe3f8d6bb3d6612db9ca310ed4eb
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"open@npm:^8.0.5":
|
"open@npm:^8.0.5":
|
||||||
version: 8.0.5
|
version: 8.0.5
|
||||||
resolution: "open@npm:8.0.5"
|
resolution: "open@npm:8.0.5"
|
||||||
@ -13555,7 +13592,7 @@ typescript@^4.2.4:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"ufo@npm:^0.6.10, ufo@npm:^0.6.11":
|
"ufo@npm:^0.6.10, ufo@npm:^0.6.11, ufo@npm:^0.6.6":
|
||||||
version: 0.6.11
|
version: 0.6.11
|
||||||
resolution: "ufo@npm:0.6.11"
|
resolution: "ufo@npm:0.6.11"
|
||||||
checksum: 3b0393dbec80e0f7072959903dc39f64368211645cafce291bf440d48e8a5c8c33c9a13ac8a6839be42d63ed0d797090d6376490aad40709d292069d2cb29c7c
|
checksum: 3b0393dbec80e0f7072959903dc39f64368211645cafce291bf440d48e8a5c8c33c9a13ac8a6839be42d63ed0d797090d6376490aad40709d292069d2cb29c7c
|
||||||
@ -13723,6 +13760,24 @@ typescript@^4.2.4:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"unstorage@npm:^0.1.2":
|
||||||
|
version: 0.1.2
|
||||||
|
resolution: "unstorage@npm:0.1.2"
|
||||||
|
dependencies:
|
||||||
|
anymatch: ^3.1.1
|
||||||
|
chokidar: ^3.5.1
|
||||||
|
h3: ^0.2.5
|
||||||
|
listhen: ^0.1.4
|
||||||
|
mri: ^1.1.6
|
||||||
|
ohmyfetch: ^0.1.8
|
||||||
|
ufo: ^0.6.10
|
||||||
|
ws: ^7.4.4
|
||||||
|
bin:
|
||||||
|
unstorage: dist/cli.js
|
||||||
|
checksum: cfe1404663c409384e7b7db8614923c69f5a94d97516a10c8a9e13eb88725d58c17caf0dad3e2cd58ddaf169bb7d6182db0bf871ee41b704e78ca15dc523e130
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"untyped@npm:^0.2.5":
|
"untyped@npm:^0.2.5":
|
||||||
version: 0.2.5
|
version: 0.2.5
|
||||||
resolution: "untyped@npm:0.2.5"
|
resolution: "untyped@npm:0.2.5"
|
||||||
|
Loading…
Reference in New Issue
Block a user