diff --git a/index.js b/index.js index 320a12ce..84686dbc 100644 --- a/index.js +++ b/index.js @@ -4,11 +4,11 @@ const VirtualModules = require('./lib/virtual'); const hotApi = require.resolve('./lib/hot-api.js'); -const { version } = require('svelte/package.json'); -const major_version = +version[0]; -const { compile, preprocess } = major_version >= 3 - ? require('svelte/compiler') - : require('svelte'); +const { + major_version, + compile, + preprocess, +} = require('./lib/resolve-svelte'); const pluginOptions = { externalDependencies: true, @@ -106,7 +106,7 @@ module.exports = function(source, map) { const virtualModules = virtualModuleInstances.get(this._compiler); this.cacheable(); - + const options = Object.assign({}, getOptions(this)); const callback = this.async(); diff --git a/lib/resolve-svelte.js b/lib/resolve-svelte.js new file mode 100644 index 00000000..bfdadf37 --- /dev/null +++ b/lib/resolve-svelte.js @@ -0,0 +1,37 @@ +const path = require('path'); + +// Svelte location can be overriden by env variable. This can be needed +// to use some external tools targetting a whole app, during development +// of svelte-loader. + +const resolveSvelte = () => { + const { SVELTE } = process.env; + if (SVELTE) { + const ensureAbsolute = name => + path.isAbsolute(name) ? name : path.resolve(process.cwd(), name); + return { + req: require, + svelte: ensureAbsolute(SVELTE), + }; + } else { + return { + req: require.main.require.bind(require.main), + svelte: 'svelte', + }; + } +}; + +const { req, svelte } = resolveSvelte(); + +const { version } = req(`${svelte}/package.json`); + +const major_version = +version[0]; + +const { compile, preprocess } = + major_version >= 3 ? req(`${svelte}/compiler`) : req(svelte); + +module.exports = { + major_version, + compile, + preprocess, +};