nuxt-plugin-bcms
Version:
Nuxt plugin for BCMS
96 lines (95 loc) • 3.25 kB
JavaScript
import { addPlugin, addServerHandler, createResolver, defineNuxtModule, } from '@nuxt/kit';
import { createBcmsMost } from '@becomes/cms-most';
import { createBcmsNuxtClient } from './client';
import { fileURLToPath } from 'url';
import { createFS } from '@banez/fs';
let bcmsMost;
export function useBcmsMost() {
return bcmsMost;
}
export function createBcmsNuxtConfig(config) {
return config;
}
export default defineNuxtModule({
meta: {
name: 'bcms',
configKey: 'bcms',
},
async setup(options, nuxt) {
const componentsVersion = 'v1.1';
const fs = createFS({
base: process.cwd(),
});
let saveComponents = false;
if (await fs.exist(['bcms-components', '__v'], true)) {
const v = await fs.readString(['bcms-components', '__v']);
if (v !== componentsVersion) {
saveComponents = true;
}
}
else {
saveComponents = true;
}
if (saveComponents) {
await fs.copy([__dirname, '_components'], ['bcms-components']);
await fs.save(['bcms-components', '__v'], componentsVersion);
}
const { resolve } = createResolver(import.meta.url);
const runtimeDir = fileURLToPath(new URL('./runtime', import.meta.url));
nuxt.options.build.transpile.push(runtimeDir);
const config = createBcmsNuxtConfig(options);
if (!config.media) {
config.media = {
output: 'public',
};
}
else if (!config.media.output) {
config.media.output = 'public';
}
if (!bcmsMost) {
bcmsMost = createBcmsMost({ config });
await bcmsMost.content.pull();
await bcmsMost.media.pull();
await bcmsMost.typeConverter.pull();
await bcmsMost.socketConnect();
createBcmsNuxtClient(bcmsMost.client);
}
addPlugin(resolve(runtimeDir, 'plugin'));
addServerHandler({
route: '/api/bcms',
method: 'get',
middleware: true,
handler: resolve(runtimeDir, 'middleware', 'content'),
});
addServerHandler({
route: `/${bcmsMost.media.output.slice(1).join('/')}`,
method: 'get',
middleware: true,
handler: resolve(runtimeDir, 'middleware', 'image'),
});
async function done() {
try {
if (config.postProcessImages) {
await bcmsMost.imageProcessor.postBuild({
buildOutput: ['.output', 'public'],
});
}
await bcmsMost.server.stop();
}
catch (error) {
console.error(error);
process.exit(1);
}
}
async function setupServer() {
await bcmsMost.server.stop();
await bcmsMost.server.start(config.server && config.server.routes ? config.server.routes : {});
}
nuxt.hook('ready', async () => {
await setupServer();
});
nuxt.hook('close', async () => {
await done();
});
},
});