diff --git a/.gitignore b/.gitignore
index 68e7d9b..79519bb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,9 +3,9 @@ node_modules
yarn.lock
yarn-error.log
package-lock.json
-/index.mjs
-/index.js
test/public/bundle.js
!test/src/index.js
/.gtm/
-/.rpt2_cache/
\ No newline at end of file
+/.rpt2_cache/
+/dist/
+
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..bdef820
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,3 @@
+{
+ "recommendations": ["svelte.svelte-vscode"]
+}
diff --git a/dev/main.js b/dev/main.js
deleted file mode 100644
index 34d0758..0000000
--- a/dev/main.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import App from './App.svelte';
-
-const app = new App({
- target: document.body
-});
\ No newline at end of file
diff --git a/dev/public/index.html b/dev/public/index.html
deleted file mode 100644
index 6404b8a..0000000
--- a/dev/public/index.html
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
-
-
-
- Svelte app
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/example/.gitignore b/example/.gitignore
new file mode 100644
index 0000000..da93220
--- /dev/null
+++ b/example/.gitignore
@@ -0,0 +1,4 @@
+/node_modules/
+/public/build/
+
+.DS_Store
diff --git a/example/README.md b/example/README.md
new file mode 100644
index 0000000..7b1ba83
--- /dev/null
+++ b/example/README.md
@@ -0,0 +1,105 @@
+*Looking for a shareable component template? Go here --> [sveltejs/component-template](https://github.com/sveltejs/component-template)*
+
+---
+
+# svelte app
+
+This is a project template for [Svelte](https://svelte.dev) apps. It lives at https://github.com/sveltejs/template.
+
+To create a new project based on this template using [degit](https://github.com/Rich-Harris/degit):
+
+```bash
+npx degit sveltejs/template svelte-app
+cd svelte-app
+```
+
+*Note that you will need to have [Node.js](https://nodejs.org) installed.*
+
+
+## Get started
+
+Install the dependencies...
+
+```bash
+cd svelte-app
+npm install
+```
+
+...then start [Rollup](https://rollupjs.org):
+
+```bash
+npm run dev
+```
+
+Navigate to [localhost:5000](http://localhost:5000). You should see your app running. Edit a component file in `src`, save it, and reload the page to see your changes.
+
+By default, the server will only respond to requests from localhost. To allow connections from other computers, edit the `sirv` commands in package.json to include the option `--host 0.0.0.0`.
+
+If you're using [Visual Studio Code](https://code.visualstudio.com/) we recommend installing the official extension [Svelte for VS Code](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). If you are using other editors you may need to install a plugin in order to get syntax highlighting and intellisense.
+
+## Building and running in production mode
+
+To create an optimised version of the app:
+
+```bash
+npm run build
+```
+
+You can run the newly built app with `npm run start`. This uses [sirv](https://github.com/lukeed/sirv), which is included in your package.json's `dependencies` so that the app will work when you deploy to platforms like [Heroku](https://heroku.com).
+
+
+## Single-page app mode
+
+By default, sirv will only respond to requests that match files in `public`. This is to maximise compatibility with static fileservers, allowing you to deploy your app anywhere.
+
+If you're building a single-page app (SPA) with multiple routes, sirv needs to be able to respond to requests for *any* path. You can make it so by editing the `"start"` command in package.json:
+
+```js
+"start": "sirv public --single"
+```
+
+## Using TypeScript
+
+This template comes with a script to set up a TypeScript development environment, you can run it immediately after cloning the template with:
+
+```bash
+node scripts/setupTypeScript.js
+```
+
+Or remove the script via:
+
+```bash
+rm scripts/setupTypeScript.js
+```
+
+## Deploying to the web
+
+### With [Vercel](https://vercel.com)
+
+Install `vercel` if you haven't already:
+
+```bash
+npm install -g vercel
+```
+
+Then, from within your project folder:
+
+```bash
+cd public
+vercel deploy --name my-project
+```
+
+### With [surge](https://surge.sh/)
+
+Install `surge` if you haven't already:
+
+```bash
+npm install -g surge
+```
+
+Then, from within your project folder:
+
+```bash
+npm run build
+surge public my-project.surge.sh
+```
diff --git a/example/package.json b/example/package.json
new file mode 100644
index 0000000..b918a25
--- /dev/null
+++ b/example/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "svelte-app",
+ "version": "1.0.0",
+ "scripts": {
+ "build": "rollup -c",
+ "dev": "rollup -c -w",
+ "start": "sirv public",
+ "validate": "svelte-check"
+ },
+ "devDependencies": {
+ "@rollup/plugin-commonjs": "^14.0.0",
+ "@rollup/plugin-node-resolve": "^8.0.0",
+ "@rollup/plugin-typescript": "^6.0.0",
+ "@tsconfig/svelte": "^1.0.0",
+ "rollup": "^2.3.4",
+ "rollup-plugin-livereload": "^2.0.0",
+ "rollup-plugin-svelte": "^6.0.0",
+ "rollup-plugin-terser": "^7.0.0",
+ "svelte": "^3.0.0",
+ "svelte-check": "^1.0.0",
+ "svelte-image-encoder": "file:../..",
+ "svelte-preprocess": "^4.0.0",
+ "tslib": "^2.0.0",
+ "typescript": "^3.9.3"
+ },
+ "dependencies": {
+ "sirv-cli": "^1.0.0"
+ }
+}
diff --git a/example/public/index.html b/example/public/index.html
new file mode 100644
index 0000000..bb77975
--- /dev/null
+++ b/example/public/index.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+ Svelte app
+
+
+
+
+
+
+
+
+
diff --git a/example/rollup.config.js b/example/rollup.config.js
new file mode 100644
index 0000000..e5508aa
--- /dev/null
+++ b/example/rollup.config.js
@@ -0,0 +1,82 @@
+import svelte from 'rollup-plugin-svelte';
+import resolve from '@rollup/plugin-node-resolve';
+import commonjs from '@rollup/plugin-commonjs';
+import livereload from 'rollup-plugin-livereload';
+import { terser } from 'rollup-plugin-terser';
+import sveltePreprocess from 'svelte-preprocess';
+import typescript from '@rollup/plugin-typescript';
+
+const production = !process.env.ROLLUP_WATCH;
+
+function serve() {
+ let server;
+
+ function toExit() {
+ if (server) server.kill(0);
+ }
+
+ return {
+ writeBundle() {
+ if (server) return;
+ server = require('child_process').spawn('npm', ['run', 'start', '--', '--dev'], {
+ stdio: ['ignore', 'inherit', 'inherit'],
+ shell: true
+ });
+
+ process.on('SIGTERM', toExit);
+ process.on('exit', toExit);
+ }
+ };
+}
+
+export default {
+ input: 'src/main.ts',
+ output: {
+ sourcemap: true,
+ format: 'iife',
+ name: 'app',
+ file: 'public/build/bundle.js'
+ },
+ plugins: [
+ svelte({
+ // enable run-time checks when not in production
+ dev: !production,
+ // we'll extract any component CSS out into
+ // a separate file - better for performance
+ css: css => {
+ css.write('bundle.css');
+ },
+ preprocess: sveltePreprocess(),
+ }),
+
+ // If you have external dependencies installed from
+ // npm, you'll most likely need these plugins. In
+ // some cases you'll need additional configuration -
+ // consult the documentation for details:
+ // https://github.com/rollup/plugins/tree/master/packages/commonjs
+ resolve({
+ browser: true,
+ dedupe: ['svelte']
+ }),
+ commonjs(),
+ typescript({
+ sourceMap: !production,
+ inlineSources: !production
+ }),
+
+ // In dev mode, call `npm run start` once
+ // the bundle has been generated
+ !production && serve(),
+
+ // Watch the `public` directory and refresh the
+ // browser on changes when not in production
+ !production && livereload('public'),
+
+ // If we're building for production (npm run build
+ // instead of npm run dev), minify
+ production && terser()
+ ],
+ watch: {
+ clearScreen: false
+ }
+};
diff --git a/dev/App.svelte b/example/src/App.svelte
similarity index 94%
rename from dev/App.svelte
rename to example/src/App.svelte
index 278f569..a44959d 100644
--- a/dev/App.svelte
+++ b/example/src/App.svelte
@@ -1,5 +1,5 @@
tag
+ // so we need to disable sourcemapping for them
+ sourceMap: false,
+ typescript: {
+ compilerOptions: {
+ sourceMap: false,
+ },
+ },
+ }),
+ {
+ filename: filePath,
+ }
+ );
+
+ // remove lang=ts from processed .svelte files
+ code = code.replace(/script lang="ts"/g, "script");
+
+ const relativePath = filePath.split(srcPath)[1];
+ const destination = path.join(distPath, filePath.split(srcPath)[1]);
+
+ // write preprocessed svelte file to /dist
+ await fs.ensureFile(destination);
+ await fs.writeFile(destination, code, { encoding: "utf-8" });
+
+ // write the unprocessed svelte component to /dist/ts/ so we can have correct types for ts users
+ const tsDest = path.join(distPath, "ts", relativePath);
+ await fs.ensureFile(tsDest);
+ await fs.writeFile(tsDest, srcCode, {
+ encoding: "utf-8",
+ });
+}
+
+main();
diff --git a/src/ImgEncoder.svelte b/src/ImgEncoder.svelte
index ff29ab5..ba433cd 100644
--- a/src/ImgEncoder.svelte
+++ b/src/ImgEncoder.svelte
@@ -1,6 +1,8 @@
-