@soleil-se/build-app
Version:
Script for building WebApps, RESTApps and Widgets with Svelte in Sitevision.
67 lines (57 loc) • 2.22 kB
JavaScript
import { dirname } from 'path';
import { findUpSync } from 'find-up';
import fse from 'fs-extra';
import { kebabCase } from 'lodash-es';
import { createRequire } from 'module';
import preprocessOptions from './common/preprocessOptions.js';
const validClassRegex = /[^a-z0-9\-_]|^[^a-z]+/gi;
function hasSvelte(input) {
const packageFile = findUpSync('package.json', { cwd: dirname(input) });
const { dependencies = {} } = fse.readJSONSync(packageFile);
return Object.keys(dependencies).includes('svelte');
}
/* Custom CSS hash requires version 3.34.0 or later */
function cssHash({ hash, css, name }) {
const validClass = name.replace(validClassRegex, '');
return `${kebabCase(validClass)}-${hash(css)}`;
}
async function getSvelteConfig() {
const svelteConfigPath = findUpSync(['svelte.config.js', 'svelte.config.cjs', 'svelte.config.mjs']);
return svelteConfigPath ? import(`file://${svelteConfigPath}`).then((pkg) => pkg.default) : {};
}
async function getPreprocess(svelteConfig) {
if (svelteConfig.preprocess) return svelteConfig.preprocess;
const sveltePreprocess = await import('svelte-preprocess').then((pkg) => pkg.default);
return sveltePreprocess(preprocessOptions);
}
function isLegacy() {
const require = createRequire(import.meta.url);
// eslint-disable-next-line import/no-extraneous-dependencies
const { version } = require('svelte/package.json');
return version.startsWith('3') || version.startsWith('4');
}
export default async function getSveltePlugin({
input, debug = false, extractCss = true, ssr, hydratable = true,
}) {
if (hasSvelte(input)) {
const svelte = await import('rollup-plugin-svelte').then((pkg) => pkg.default);
const svelteConfig = await getSvelteConfig();
return svelte({
preprocess: await getPreprocess(svelteConfig),
emitCss: extractCss,
compilerOptions: {
css: !extractCss ? 'injected' : undefined,
...svelteConfig.compilerOptions,
generate: ssr ? 'server' : 'client',
dev: debug,
cssHash,
...(isLegacy() ? {
enableSourcemap: debug,
hydratable,
generate: ssr ? 'ssr' : 'dom',
} : {}),
},
});
}
return false;
}