diff --git a/packages/http/package.json b/packages/http/package.json index 9d7e75e..3038f54 100644 --- a/packages/http/package.json +++ b/packages/http/package.json @@ -34,6 +34,8 @@ "server/build/template.ejs", "server/build/http.neutrinorc.js", "server/build/http.neutrinorc.js.map", + "server/style-loader.js", + "server/style-loader.js.map", "src", "tests.js", "tests.js.map" diff --git a/packages/http/src/server/index.js b/packages/http/src/server/index.js index 537675a..70f377a 100644 --- a/packages/http/src/server/index.js +++ b/packages/http/src/server/index.js @@ -1,5 +1,5 @@ import {D, Hooks} from '@flecks/core'; -import {Flecks, spawnWith} from '@flecks/core/server'; +import {Flecks, require as R, spawnWith} from '@flecks/core/server'; import fontLoader from '@neutrinojs/font-loader'; import imageLoader from '@neutrinojs/image-loader'; import styleLoader from '@neutrinojs/style-loader'; @@ -45,6 +45,14 @@ export default { }), ); }); + if ('fleck' === target) { + config.use.push((neutrino) => { + neutrino.config.module.rule('compile').use('babel').tap((options) => ({ + ...options, + plugins: [...options.plugins, R.resolve('@flecks/http/server/style-loader')], + })); + }); + } config.use.push(fontLoader()); config.use.push(imageLoader()); }, diff --git a/packages/http/src/server/style-loader.js b/packages/http/src/server/style-loader.js new file mode 100644 index 0000000..7fd1462 --- /dev/null +++ b/packages/http/src/server/style-loader.js @@ -0,0 +1,22 @@ +const parser = require('@babel/parser'); +const types = require('@babel/types'); + +let id = 0; + +module.exports = () => ({ + visitor: { + /* eslint-disable no-param-reassign */ + ImportDeclaration(path) { + if (path.node.source.value.match(/\.(c|s[ac])ss$/)) { + let defaultSpecifier = path.node.specifiers.find(types.isImportDefaultSpecifier); + if (!defaultSpecifier) { + defaultSpecifier = types.importDefaultSpecifier(types.identifier(`FLECKS_STYLES_${id++}`)); + path.node.specifiers.unshift(defaultSpecifier); + } + const {name} = defaultSpecifier.local; + path.insertAfter(parser.parse(`if ('undefined' !== typeof document) ${name}.use();`)); + } + }, + /* eslint-enable no-param-reassign */ + }, +});