@scayle/storefront-nuxt
Version:
Nuxt integration for the SCAYLE Commerce Engine and Storefront API
86 lines (85 loc) • 2.96 kB
JavaScript
import { createConsola } from "consola";
import {
STORAGE_MOUNT_CACHE,
STORAGE_MOUNT_SESSION
} from "../../server/utils/cacheStorage.js";
import createLog from "../../createLog.js";
import { JSONReporter } from "../../JSONReporter.js";
import drivers from "#virtual/storage-drivers";
import { defineNitroPlugin } from "nitropack/runtime/plugin";
import { useStorage } from "nitropack/runtime/storage";
import { useRuntimeConfig } from "#imports";
import { getAvailableMounts } from "../../utils/storage.js";
function createMountDriver(options) {
if (options?.driver) {
const compression = options?.compression;
const isCompressionEnabled = !!compression && compression !== "none";
const driver = drivers[options.driver ?? "memory"];
const createdDriver = driver({ ...options });
return isCompressionEnabled ? drivers.compression({
...options,
encoding: compression,
passthroughDriver: createdDriver
}) : createdDriver;
}
return drivers.memory();
}
function mountStorage(storage, options) {
const { config, base } = options;
const mounts = getAvailableMounts(storage);
if (!mounts.includes(base)) {
if (config) {
storage.mount(base, createMountDriver(config));
} else {
storage.mount(base, createMountDriver());
}
}
}
export default defineNitroPlugin(() => {
const storage = useStorage();
const config = useRuntimeConfig();
const { shops } = config.storefront;
const logConfig = config.public.storefront.log;
const log = createLog(
(opts) => createConsola({
...logConfig.json ? { reporters: [new JSONReporter()] } : void 0,
stderr: logConfig.output === "stdout" ? process.stdout : process.stderr,
stdout: logConfig.output === "stderr" ? process.stderr : process.stdout,
...opts
}),
logConfig.name,
logConfig.level
);
try {
const globalCacheConfig = config.storefront.storage?.cache;
mountStorage(storage, {
base: STORAGE_MOUNT_CACHE,
config: globalCacheConfig
});
const globalSessionConfig = config.storefront.storage?.session;
mountStorage(storage, {
base: STORAGE_MOUNT_SESSION,
config: globalSessionConfig
});
for (const shop of Object.values(shops)) {
const shopCacheMount = `${STORAGE_MOUNT_CACHE}:${shop.shopId}`;
const shopSessionMount = `${STORAGE_MOUNT_SESSION}:${shop.shopId}`;
const cacheConfig = shop.storage?.cache ?? config.storefront.storage?.cache;
if (cacheConfig) {
mountStorage(storage, {
base: shopCacheMount,
config: cacheConfig
});
}
const sessionConfig = shop.storage?.session ?? config.storefront.storage?.session;
if (sessionConfig) {
mountStorage(storage, {
base: shopSessionMount,
config: sessionConfig
});
}
}
} catch (error) {
log.error("Unable to create required cache driver during startup.", error);
}
});