diff --git a/assets/js/hooks.js b/assets/js/hooks.js index 1859c57..16a52d8 100644 --- a/assets/js/hooks.js +++ b/assets/js/hooks.js @@ -1,13 +1,8 @@ import * as Components from '../svelte/components/**/*' +import {exportSvelteComponents} from 'live_svelte' import {detach, insert, noop} from 'svelte/internal' -let {default: modules, filenames} = Components - -filenames = filenames - .map(name => name.replace('../svelte/components/', '')) - .map(name => name.replace('.svelte', '')) - -const components = Object.assign({}, ...modules.map((m, index) => ({[filenames[index]]: m.default}))) +const components = exportSvelteComponents(Components) function base64ToElement(base64) { let template = document.createElement('div') diff --git a/assets/js/server.js b/assets/js/server.js index 7268c5d..17cafab 100644 --- a/assets/js/server.js +++ b/assets/js/server.js @@ -1,9 +1,4 @@ import * as Components from '../svelte/components/**/*' +import {exportSvelteComponents} from 'live_svelte' -let { default: modules, filenames } = Components - -filenames = filenames - .map(name => name.replace('../svelte/components/', '')) - .map(name => name.replace('.svelte', '')) - -module.exports = Object.assign({}, ...modules.map((m, index) => ({[filenames[index]]: m.default}))) +module.exports = exportSvelteComponents(Components) diff --git a/assets/svelte/render.js b/assets/svelte/render.js index 784d43b..365a427 100644 --- a/assets/svelte/render.js +++ b/assets/svelte/render.js @@ -1,24 +1,4 @@ -const componentPath = '../../priv/static/assets/server/server.js' +var path = require("path") +var absolutePath = path.resolve("./priv/static/assets/server/server.js") -/*** - * Render a component with the name, props and slots provided. - */ -function render(name, props = {}, slots = null) { - // remove from cache in non-production environments - // so that we can see changes - if ( - process.env.NODE_ENV !== 'production' && - require.resolve(componentPath) in require.cache - ) { - delete require.cache[require.resolve(componentPath)] - } - - const component = require(componentPath)[name].default - const $$slots = Object.fromEntries(Object.entries(slots).map(([k, v]) => [k, () => v])) || {} - - return component.render(props, { $$slots, context: new Map() }) -} - -module.exports = { - render, -} +module.exports.render = require("live_svelte").getRender(absolutePath) diff --git a/lib/mix/tasks/install_npm_deps.ex b/lib/mix/tasks/install_npm_deps.ex index 58b89bd..0d57173 100644 --- a/lib/mix/tasks/install_npm_deps.ex +++ b/lib/mix/tasks/install_npm_deps.ex @@ -10,7 +10,7 @@ defmodule Mix.Tasks.LiveSvelte.InstallNpmDeps do "cd assets && npm install --save-dev esbuild@^0.16.17 esbuild-svelte svelte svelte-preprocess esbuild-plugin-import-glob && - npm install --save ../deps/phoenix ../deps/phoenix_html ../deps/phoenix_live_view" + npm install --save ../deps/phoenix ../deps/phoenix_html ../deps/phoenix_live_view ../deps/live_svelte" |> String.to_charlist() |> :os.cmd() |> IO.puts() diff --git a/package.json b/package.json index 7076fc3..aec1aeb 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,13 @@ "version": "0.2.0", "description": "", "license": "MIT", - "main": "./priv/static/live_svelte.js", + "module": "./priv/live_svelte.esm.js", + "main": "./priv/live_svelte.cjs.js", "author": "Wout De Puysseleir ", + "exports": { + "import": "./priv/live_svelte.esm.js", + "require": "./priv/live_svelte.cjs.js" + }, "repository": { "type": "git", "url": "git://github.com/woutdp/live_svelte.git" @@ -15,6 +20,6 @@ "LICENSE.md", "package.json", "assets/js/phoenix/*", - "priv/static/live_svelte.js" + "priv/*" ] -} \ No newline at end of file +} diff --git a/priv/live_svelte.cjs.js b/priv/live_svelte.cjs.js new file mode 100644 index 0000000..e2a6993 --- /dev/null +++ b/priv/live_svelte.cjs.js @@ -0,0 +1,26 @@ +function getRender(componentPath) { + /*** + * Render a component with the name, props and slots provided. + */ + function render(name, props = {}, slots = null) { + // remove from cache in non-production environments + // so that we can see changes + if ( + process.env.NODE_ENV !== 'production' && + require.resolve(componentPath) in require.cache + ) { + delete require.cache[require.resolve(componentPath)] + } + + const component = require(componentPath)[name].default + const $$slots = Object.fromEntries(Object.entries(slots).map(([k, v]) => [k, () => v])) || {} + + return component.render(props, { $$slots, context: new Map() }) + } + + return render +} + +module.exports = { + getRender +} diff --git a/priv/live_svelte.esm.js b/priv/live_svelte.esm.js new file mode 100644 index 0000000..95b2ac0 --- /dev/null +++ b/priv/live_svelte.esm.js @@ -0,0 +1,13 @@ +function exportSvelteComponents(components) { + let { default: modules, filenames } = components + + filenames = filenames + .map(name => name.replace('../svelte/components/', '')) + .map(name => name.replace('.svelte', '')) + + return Object.assign({}, ...modules.map((m, index) => ({[filenames[index]]: m.default}))) +} + +module.exports = { + exportSvelteComponents, +} diff --git a/priv/static/live_svelte.js b/priv/static/live_svelte.js deleted file mode 100644 index e69de29..0000000