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 @@ -