├── .prettierrc.yaml
├── .gitignore
├── public
├── favicon.png
├── index.html
└── global.css
├── src
├── types.ts
├── main.ts
├── Tabs.svelte
├── App.svelte
├── Output.svelte
├── Input.svelte
└── worker.ts
├── tsconfig.json
├── package.json
├── LICENSE
├── rollup.config.js
├── README.md
└── pnpm-lock.yaml
/.prettierrc.yaml:
--------------------------------------------------------------------------------
1 | useTabs: true
2 | svelteSortOrder: scripts-markup-styles
3 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules/
2 | /public/build/
3 |
4 | .DS_Store
5 | .vscode
6 |
--------------------------------------------------------------------------------
/public/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/pngwn/REPLicant/HEAD/public/favicon.png
--------------------------------------------------------------------------------
/src/types.ts:
--------------------------------------------------------------------------------
1 | export interface Tab {
2 | id: number;
3 | name: string;
4 | type: string;
5 | }
6 |
7 | export interface Component extends Tab {
8 | source: string;
9 | }
10 |
--------------------------------------------------------------------------------
/src/main.ts:
--------------------------------------------------------------------------------
1 | import App from './App.svelte';
2 |
3 | const app = new App({
4 | target: document.body,
5 | props: {
6 | name: 'world'
7 | }
8 | });
9 |
10 | export default app;
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@tsconfig/svelte/tsconfig.json",
3 | "compilerOptions": {
4 | "isolatedModules": false,
5 | "lib": [
6 | "webworker",
7 | "DOM",
8 | "ES6"
9 | ]
10 | },
11 | "include": ["src/**/*"],
12 | "exclude": ["node_modules/*", "__sapper__/*", "public/*"],
13 | }
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Svelte app
8 |
9 |
10 |
11 |
12 |
13 |
14 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/src/Tabs.svelte:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 | {#each tabs as { name, type, id }}
14 | - dispatch('select', id)}>
15 | {name}.{type}
16 |
17 | {/each}
18 |
19 |
20 |
21 |
27 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "svelte-app",
3 | "version": "1.0.0",
4 | "scripts": {
5 | "build": "rollup -c",
6 | "dev": "rollup -c -w",
7 | "start": "sirv public",
8 | "validate": "svelte-check"
9 | },
10 | "devDependencies": {
11 | "@rollup/plugin-commonjs": "^14.0.0",
12 | "@rollup/plugin-node-resolve": "^8.0.0",
13 | "rollup": "^2.3.4",
14 | "rollup-plugin-livereload": "^2.0.0",
15 | "rollup-plugin-svelte": "^6.0.0",
16 | "rollup-plugin-terser": "^7.0.0",
17 | "svelte": "^3.0.0",
18 | "svelte-check": "^1.0.0",
19 | "svelte-preprocess": "^4.0.0",
20 | "@rollup/plugin-typescript": "^6.0.0",
21 | "typescript": "^3.9.3",
22 | "tslib": "^2.0.0",
23 | "@tsconfig/svelte": "^1.0.0"
24 | },
25 | "dependencies": {
26 | "sirv-cli": "^1.0.0"
27 | }
28 | }
--------------------------------------------------------------------------------
/src/App.svelte:
--------------------------------------------------------------------------------
1 |
42 |
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/src/Output.svelte:
--------------------------------------------------------------------------------
1 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/src/Input.svelte:
--------------------------------------------------------------------------------
1 |
33 |
34 |
35 | (current = detail)}
39 | on:new={new_component} />
40 |
43 |
44 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 pngwn
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/rollup.config.js:
--------------------------------------------------------------------------------
1 | import svelte from "rollup-plugin-svelte";
2 | import resolve from "@rollup/plugin-node-resolve";
3 | import commonjs from "@rollup/plugin-commonjs";
4 | import livereload from "rollup-plugin-livereload";
5 | import sveltePreprocess from "svelte-preprocess";
6 | import typescript from "@rollup/plugin-typescript";
7 |
8 | const production = !process.env.ROLLUP_WATCH;
9 |
10 | const onwarn = ({ message }) =>
11 | message.includes("@rollup/plugin-typescript TS2315");
12 |
13 | function serve() {
14 | let server;
15 |
16 | function toExit() {
17 | if (server) server.kill(0);
18 | }
19 |
20 | return {
21 | writeBundle() {
22 | if (server) return;
23 | server = require("child_process").spawn(
24 | "npm",
25 | ["run", "start", "--", "--dev"],
26 | {
27 | stdio: ["ignore", "inherit", "inherit"],
28 | shell: true,
29 | }
30 | );
31 |
32 | process.on("SIGTERM", toExit);
33 | process.on("exit", toExit);
34 | },
35 | };
36 | }
37 |
38 | export default [
39 | {
40 | input: "src/main.ts",
41 | output: {
42 | sourcemap: true,
43 | format: "iife",
44 | name: "app",
45 | file: "public/build/bundle.js",
46 | },
47 | plugins: [
48 | svelte({
49 | dev: !production,
50 | css: (css) => {
51 | css.write("bundle.css");
52 | },
53 | preprocess: sveltePreprocess(),
54 | }),
55 |
56 | resolve({
57 | browser: true,
58 | dedupe: ["svelte"],
59 | }),
60 | commonjs(),
61 | typescript(),
62 | !production && serve(),
63 | !production && livereload("public"),
64 | ],
65 | watch: {
66 | clearScreen: false,
67 | },
68 | onwarn,
69 | },
70 | {
71 | input: "src/worker.ts",
72 | output: {
73 | sourcemap: true,
74 | format: "esm",
75 | name: "app",
76 | file: "public/worker.js",
77 | },
78 | plugins: [
79 | resolve({
80 | browser: true,
81 | dedupe: ["svelte"],
82 | }),
83 | commonjs(),
84 | typescript(),
85 | ],
86 | watch: {
87 | clearScreen: false,
88 | },
89 | onwarn,
90 | },
91 | ];
92 |
--------------------------------------------------------------------------------
/src/worker.ts:
--------------------------------------------------------------------------------
1 | import type { Component } from "./types";
2 |
3 | import * as rollup from "rollup/dist/es/rollup.browser.js";
4 |
5 | // you could use unpkg like the official repl, i thought i'd try out jsdelivr
6 | const CDN_URL = "https://cdn.jsdelivr.net/npm";
7 | importScripts(`${CDN_URL}/svelte/compiler.js`);
8 |
9 | const component_lookup: Map = new Map();
10 |
11 | async function fetch_package(url: string): Promise {
12 | return (await fetch(url)).text();
13 | }
14 |
15 | function generate_lookup(components: Component[]): void {
16 | components.forEach((component) => {
17 | component_lookup.set(`./${component.name}.${component.type}`, component);
18 | });
19 | }
20 |
21 | self.addEventListener(
22 | "message",
23 | async (event: MessageEvent): Promise => {
24 | generate_lookup(event.data);
25 |
26 | const bundle = await rollup.rollup({
27 | input: "./App.svelte",
28 | plugins: [
29 | {
30 | name: "repl-plugin",
31 | async resolveId(importee: string, importer: string) {
32 | // handle imports from 'svelte'
33 |
34 | // import x from 'svelte'
35 | if (importee === "svelte") return `${CDN_URL}/svelte/index.mjs`;
36 |
37 | // import x from 'svelte/somewhere'
38 | if (importee.startsWith("svelte/")) {
39 | return `${CDN_URL}/svelte/${importee.slice(7)}/index.mjs`;
40 | }
41 |
42 | // import x from './file.js' (via a 'svelte' or 'svelte/x' package)
43 | if (importer && importer.startsWith(`${CDN_URL}/svelte`)) {
44 | const resolved = new URL(importee, importer).href;
45 | if (resolved.endsWith(".mjs")) return resolved;
46 | return `${resolved}/index.mjs`;
47 | }
48 |
49 | // local repl components
50 | if (component_lookup.has(importee)) return importee;
51 |
52 | // relative imports from a remote package
53 | if (importee.startsWith("."))
54 | return new URL(importee, importer).href;
55 |
56 | // bare named module imports (importing an npm package)
57 |
58 | // get the package.json and load it into memory
59 | const pkg_url = `${CDN_URL}/${importee}/package.json`;
60 | const pkg = JSON.parse(await fetch_package(pkg_url));
61 |
62 | // get an entry point from the pkg.json - first try svelte, then modules, then main
63 | if (pkg.svelte || pkg.module || pkg.main) {
64 | // use the aobove url minus `/package.json` to resolve the URL
65 | const url = pkg_url.replace(/\/package\.json$/, "");
66 | return new URL(pkg.svelte || pkg.module || pkg.main, `${url}/`)
67 | .href;
68 | }
69 |
70 | // we probably missed stuff, pass it along as is
71 | return importee;
72 | },
73 | async load(id: string) {
74 | // local repl components are stored in memory
75 | // this is our virtual filesystem
76 | if (component_lookup.has(id))
77 | return component_lookup.get(id).source;
78 |
79 | // everything else comes from a cdn
80 | return await fetch_package(id);
81 | },
82 | transform(code: string, id: string) {
83 | // our only transform is to compile svelte components
84 | //@ts-ignore
85 | if (/.*\.svelte/.test(id)) return svelte.compile(code).js.code;
86 | },
87 | },
88 | ],
89 | });
90 |
91 | // a touch longwinded but output contains an array of chunks
92 | // we are not code-splitting, so we only have a single chunk
93 | const output: string = (await bundle.generate({ format: "esm" })).output[0]
94 | .code;
95 |
96 | self.postMessage(output);
97 | }
98 | );
99 |
--------------------------------------------------------------------------------
/public/global.css:
--------------------------------------------------------------------------------
1 | /* Base Styles
2 | –––––––––––––––––––––––––––––––––––––––––––––––––– */
3 | /* NOTE
4 | html is set to 62.5% so that all the REM measurements throughout Skeleton
5 | are based on 10px sizing. So basically 1.5rem = 15px :) */
6 | html {
7 | font-size: 62.5%;
8 | height: 100%;
9 | box-sizing: border-box;
10 | margin: 0;
11 | padding: 0;
12 | }
13 | body {
14 | font-size: 1.5em; /* currently ems cause chrome bug misinterpreting rems on body element */
15 | line-height: 1.6;
16 | font-weight: 400;
17 | font-family: "Raleway", "HelveticaNeue", "Helvetica Neue", Helvetica, Arial,
18 | sans-serif;
19 | color: #222;
20 | height: 100%;
21 | margin: 0;
22 | padding: 0;
23 | box-sizing: border-box;
24 | }
25 |
26 | /* Typography
27 | –––––––––––––––––––––––––––––––––––––––––––––––––– */
28 | h1,
29 | h2,
30 | h3,
31 | h4,
32 | h5,
33 | h6 {
34 | margin-top: 0;
35 | margin-bottom: 2rem;
36 | font-weight: 300;
37 | }
38 | h1 {
39 | font-size: 4rem;
40 | line-height: 1.2;
41 | letter-spacing: -0.1rem;
42 | }
43 | h2 {
44 | font-size: 3.6rem;
45 | line-height: 1.25;
46 | letter-spacing: -0.1rem;
47 | }
48 | h3 {
49 | font-size: 3rem;
50 | line-height: 1.3;
51 | letter-spacing: -0.1rem;
52 | }
53 | h4 {
54 | font-size: 2.4rem;
55 | line-height: 1.35;
56 | letter-spacing: -0.08rem;
57 | }
58 | h5 {
59 | font-size: 1.8rem;
60 | line-height: 1.5;
61 | letter-spacing: -0.05rem;
62 | }
63 | h6 {
64 | font-size: 1.5rem;
65 | line-height: 1.6;
66 | letter-spacing: 0;
67 | }
68 |
69 | /* Larger than phablet */
70 | @media (min-width: 550px) {
71 | h1 {
72 | font-size: 5rem;
73 | }
74 | h2 {
75 | font-size: 4.2rem;
76 | }
77 | h3 {
78 | font-size: 3.6rem;
79 | }
80 | h4 {
81 | font-size: 3rem;
82 | }
83 | h5 {
84 | font-size: 2.4rem;
85 | }
86 | h6 {
87 | font-size: 1.5rem;
88 | }
89 | }
90 |
91 | p {
92 | margin-top: 0;
93 | }
94 |
95 | /* Links
96 | –––––––––––––––––––––––––––––––––––––––––––––––––– */
97 | a {
98 | color: #1eaedb;
99 | }
100 | a:hover {
101 | color: #0fa0ce;
102 | }
103 |
104 | /* Buttons
105 | –––––––––––––––––––––––––––––––––––––––––––––––––– */
106 | .button,
107 | button,
108 | input[type="submit"],
109 | input[type="reset"],
110 | input[type="button"] {
111 | display: inline-block;
112 | height: 38px;
113 | padding: 0 30px;
114 | color: #555;
115 | text-align: center;
116 | font-size: 11px;
117 | font-weight: 600;
118 | line-height: 38px;
119 | letter-spacing: 0.1rem;
120 | text-transform: uppercase;
121 | text-decoration: none;
122 | white-space: nowrap;
123 | background-color: transparent;
124 | border-radius: 4px;
125 | border: 1px solid #bbb;
126 | cursor: pointer;
127 | box-sizing: border-box;
128 | }
129 | .button:hover,
130 | button:hover,
131 | input[type="submit"]:hover,
132 | input[type="reset"]:hover,
133 | input[type="button"]:hover,
134 | .button:focus,
135 | button:focus,
136 | input[type="submit"]:focus,
137 | input[type="reset"]:focus,
138 | input[type="button"]:focus {
139 | color: #333;
140 | border-color: #888;
141 | outline: 0;
142 | }
143 | .button.button-primary,
144 | button.button-primary,
145 | input[type="submit"].button-primary,
146 | input[type="reset"].button-primary,
147 | input[type="button"].button-primary {
148 | color: #fff;
149 | background-color: #33c3f0;
150 | border-color: #33c3f0;
151 | }
152 | .button.button-primary:hover,
153 | button.button-primary:hover,
154 | input[type="submit"].button-primary:hover,
155 | input[type="reset"].button-primary:hover,
156 | input[type="button"].button-primary:hover,
157 | .button.button-primary:focus,
158 | button.button-primary:focus,
159 | input[type="submit"].button-primary:focus,
160 | input[type="reset"].button-primary:focus,
161 | input[type="button"].button-primary:focus {
162 | color: #fff;
163 | background-color: #1eaedb;
164 | border-color: #1eaedb;
165 | }
166 |
167 | /* Forms
168 | –––––––––––––––––––––––––––––––––––––––––––––––––– */
169 | input[type="email"],
170 | input[type="number"],
171 | input[type="search"],
172 | input[type="text"],
173 | input[type="tel"],
174 | input[type="url"],
175 | input[type="password"],
176 | textarea,
177 | select {
178 | height: 38px;
179 | padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */
180 | background-color: #fff;
181 | border: 1px solid #d1d1d1;
182 | border-radius: 4px;
183 | box-shadow: none;
184 | box-sizing: border-box;
185 | }
186 | /* Removes awkward default styles on some inputs for iOS */
187 | input[type="email"],
188 | input[type="number"],
189 | input[type="search"],
190 | input[type="text"],
191 | input[type="tel"],
192 | input[type="url"],
193 | input[type="password"],
194 | textarea {
195 | -webkit-appearance: none;
196 | -moz-appearance: none;
197 | appearance: none;
198 | }
199 | textarea {
200 | min-height: 65px;
201 | padding-top: 6px;
202 | padding-bottom: 6px;
203 | }
204 | input[type="email"]:focus,
205 | input[type="number"]:focus,
206 | input[type="search"]:focus,
207 | input[type="text"]:focus,
208 | input[type="tel"]:focus,
209 | input[type="url"]:focus,
210 | input[type="password"]:focus,
211 | textarea:focus,
212 | select:focus {
213 | border: 1px solid #33c3f0;
214 | outline: 0;
215 | }
216 | label,
217 | legend {
218 | display: block;
219 | margin-bottom: 0.5rem;
220 | font-weight: 600;
221 | }
222 | fieldset {
223 | padding: 0;
224 | border-width: 0;
225 | }
226 | input[type="checkbox"],
227 | input[type="radio"] {
228 | display: inline;
229 | }
230 | label > .label-body {
231 | display: inline-block;
232 | margin-left: 0.5rem;
233 | font-weight: normal;
234 | }
235 |
236 | /* Lists
237 | –––––––––––––––––––––––––––––––––––––––––––––––––– */
238 | ul {
239 | list-style: circle inside;
240 | }
241 | ol {
242 | list-style: decimal inside;
243 | }
244 | ol,
245 | ul {
246 | padding-left: 0;
247 | margin-top: 0;
248 | }
249 | ul ul,
250 | ul ol,
251 | ol ol,
252 | ol ul {
253 | margin: 1.5rem 0 1.5rem 3rem;
254 | font-size: 90%;
255 | }
256 | li {
257 | margin-bottom: 1rem;
258 | }
259 |
260 | /* Code
261 | –––––––––––––––––––––––––––––––––––––––––––––––––– */
262 | code {
263 | padding: 0.2rem 0.5rem;
264 | margin: 0 0.2rem;
265 | font-size: 90%;
266 | white-space: nowrap;
267 | background: #f1f1f1;
268 | border: 1px solid #e1e1e1;
269 | border-radius: 4px;
270 | }
271 | pre > code {
272 | display: block;
273 | padding: 1rem 1.5rem;
274 | white-space: pre;
275 | }
276 |
277 | /* Tables
278 | –––––––––––––––––––––––––––––––––––––––––––––––––– */
279 | th,
280 | td {
281 | padding: 12px 15px;
282 | text-align: left;
283 | border-bottom: 1px solid #e1e1e1;
284 | }
285 | th:first-child,
286 | td:first-child {
287 | padding-left: 0;
288 | }
289 | th:last-child,
290 | td:last-child {
291 | padding-right: 0;
292 | }
293 |
294 | /* Spacing
295 | –––––––––––––––––––––––––––––––––––––––––––––––––– */
296 | button,
297 | .button {
298 | margin-bottom: 1rem;
299 | }
300 | input,
301 | textarea,
302 | select,
303 | fieldset {
304 | margin-bottom: 1.5rem;
305 | }
306 | pre,
307 | blockquote,
308 | dl,
309 | figure,
310 | table,
311 | p,
312 | ul,
313 | ol,
314 | form {
315 | margin-bottom: 2.5rem;
316 | }
317 |
318 | ul {
319 | list-style: none;
320 | display: flex;
321 | font-size: 1.3rem;
322 | }
323 |
324 | li {
325 | margin: 0 0 0 10px;
326 | padding: 0;
327 | display: flex;
328 | align-items: center;
329 | }
330 |
331 | button {
332 | padding: 0 5px;
333 | height: 2.2rem;
334 | font-weight: 500;
335 | font-size: 1.6rem;
336 | line-height: 2.2rem;
337 | margin: 0;
338 | }
339 |
340 | main {
341 | text-align: center;
342 | padding: 1em;
343 | margin: 0 auto;
344 | height: 100%;
345 | box-sizing: border-box;
346 | display: flex;
347 | }
348 |
349 | section {
350 | width: 50%;
351 | height: 100%;
352 | resize: none;
353 | display: flex;
354 | flex-direction: column;
355 | }
356 |
357 | textarea {
358 | width: 100%;
359 | height: 100%;
360 | resize: none;
361 | }
362 |
363 | iframe {
364 | width: 100%;
365 | height: 100%;
366 | border: none;
367 | }
368 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # REPLicant - Svelte Summit 2020
2 |
3 | This is the source code for a [talk I gave at Svelte Summit 2020](https://www.youtube.com/watch?v=S3j1fLzC8_E). This is actual code I wrote during the talk with a few later additions to clean things up. I will add a link to the video when it is published.
4 |
5 | ## Table of Contents
6 |
7 | - [Differences from the talk](#differences-from-the-talk)
8 | - [Usage](#usage)
9 | - [Commits](#commits)
10 | - [Initial setup and config](#initial-setup-and-config)
11 | - [REPL code editor](#repl-code-editor)
12 | - [Tabbed interface](#tabbed-interface)
13 | - [New component creation](#new-component-creation)
14 | - [Web Worker setup](#web-worker-setup)
15 | - [Svelte package imports](#svelte-package-imports)
16 | - [Local package imports](#local-package-imports)
17 | - [Iframe setup](#iframe-setup)
18 | - [Evaluate and render](#evaluate-and-render)
19 | - [NPM module imports](#npm-module-imports)
20 | - [What next?](#what-next)
21 | - [Further reading](#further-reading)
22 |
23 | ## Differences from the talk
24 |
25 | The only thing this app does that the version in the talk doesn't is resolve npm module imports to a CDN. So `import x from 'randommodule'` works in this app too. You can read more details about this [here](#npm-module-imports).
26 |
27 | ## Usage
28 |
29 | _Note: I use `pnpm` but this will probably work fine with `yarn` or `npm` depsite the lockfile warnings._
30 |
31 | Clone and install
32 |
33 | ```bash
34 | git clone https://github.com/pngwn/REPLicant.git && cd REPLicant
35 |
36 | pnpm i # or yarn or npm i
37 | ```
38 |
39 | Run the dev server and play around:
40 |
41 | ```bash
42 | pnpm dev
43 | ```
44 |
45 | ## Commits
46 |
47 | ### initial setup and config
48 |
49 | This commit setups the basics. It is the [svelte-template]() after running the `setupTypescript` script with a few extra config files (`.prettierrc.yaml` and `.gitignore`).
50 |
51 | We also add some basic typescript interfaces and data structures for the REPL.
52 |
53 | [Browse the repo at this point](https://github.com/pngwn/REPLicant/tree/534b9fe0527fc14c58a7551a9a8196c4468a1040)\
54 | [View the commit](https://github.com/pngwn/REPLicant/commit/534b9fe0527fc14c58a7551a9a8196c4468a1040)
55 |
56 | ### repl code editor
57 |
58 | This commit adds an input, which is our rudimentary code editor and keeps the contents of the input in sync with the component state we setup earlier.
59 |
60 | [Browse the repo at this point](https://github.com/pngwn/REPLicant/tree/a26696c2ce634979d9481fa36b44d1529d7f6890)\
61 | [View the diff](https://github.com/pngwn/REPLicant/commit/a26696c2ce634979d9481fa36b44d1529d7f6890)
62 |
63 | ### tabbed interface
64 |
65 | This commit adds a tabbed UI allowing us to switch between the different components, marking them as active. The 'active' component is the component we are currently editing in the REPL.
66 |
67 | [Browse the repo at this point](https://github.com/pngwn/REPLicant/tree/f87252385b84b84daa7534353c04d8665dd32b60)\
68 | [View the diff](https://github.com/pngwn/REPLicant/commit/f87252385b84b84daa7534353c04d8665dd32b60)
69 |
70 | ### new component creation
71 |
72 | This commit adds a button allowing the creation of a new component in the REPL as well as accompanying logic. This only supports the creation of svelte components (`.svelte` files) and the name is automatically generated.
73 |
74 | [Browse the repo at this point](https://github.com/pngwn/REPLicant/tree/fd783d86fefdf85847b2805d57887c569fa677ac)\
75 | [View the diff](https://github.com/pngwn/REPLicant/commit/fd783d86fefdf85847b2805d57887c569fa677ac)
76 |
77 | ### web worker setup
78 |
79 | This commit sets up the basic web worker boilerplate as well as some simple messaging to make sure things are working as expected.
80 |
81 | It also adds another entrypoint in the rollup config, to bundle the worker file seperately.
82 |
83 | [Browse the repo at this point](https://github.com/pngwn/REPLicant/tree/abd59742d41d68618d9b61945711429ae70b7515)\
84 | [View the diff](https://github.com/pngwn/REPLicant/commit/abd59742d41d68618d9b61945711429ae70b7515)
85 |
86 | ### Svelte package imports
87 |
88 | This commit setups the rollup basics that we need and resolves svelte imports to the CDN we are using (jsdelivr) as we have no file system. It resolve the follwing cases:
89 |
90 | - plain 'svelte' imports: `import { onMount } from 'svelte';`
91 | - svelte 'sub imports': `import { writable } from 'svelte/writable';`
92 | - relative imports from a svelte package: `import x from './file.js';` where the importing module is module is a svelte module that we handled above.
93 |
94 | In addition to resolving the paths, it also fetches the source code from the cdn and passes it to the bundler.
95 |
96 | [Browse the repo at this point](https://github.com/pngwn/REPLicant/tree/1899a92812683bd12f3063ee51dae7f9f2795e15)\
97 | [View the diff](https://github.com/pngwn/REPLicant/commit/1899a92812683bd12f3063ee51dae7f9f2795e15)
98 |
99 | ### Local package imports
100 |
101 | This commit resolves local REPL imports that don't exist anywhere except in memory. These are the components that the user is creating live in the browser.
102 |
103 | It also compiles svelte components to valid javascript and returns that to the bundler.
104 |
105 | And finally it passes this final bundle back to the main thread.
106 |
107 | [Browse the repo at this point](https://github.com/pngwn/REPLicant/tree/28f54dbd8af541374427b61d643b1729b88a4dad)\
108 | [View the diff](https://github.com/pngwn/REPLicant/commit/28f54dbd8af541374427b61d643b1729b88a4dad)
109 |
110 | ### Iframe setup
111 |
112 | This commit sets up the basic ifram boilerplate, giving it a valid `srcdoc`, listening for any posted messages inside. In the parent component (outside of the iframe) we pass a simple message down to check everything is working.
113 |
114 | [Browse the repo at this point](https://github.com/pngwn/REPLicant/tree/e0362b500ee191c68aec9b9a0fa1c7f5fc3b8465)\
115 | [View the diff](https://github.com/pngwn/REPLicant/commit/e0362b500ee191c68aec9b9a0fa1c7f5fc3b8465)
116 |
117 | ### Evaluate and render
118 |
119 | This commit evaluates the bundle in the iframe via a dynamic import using blob urls and then renders the component to the page.
120 |
121 | [Browse the repo at this point](https://github.com/pngwn/REPLicant/tree/9709717a52577d050a7eec5a53ba6c6ddbaf5196)\
122 | [View the diff](https://github.com/pngwn/REPLicant/commit/9709717a52577d050a7eec5a53ba6c6ddbaf5196)
123 |
124 | ### NPM module imports
125 |
126 | _This did not appear in the talk_
127 |
128 | This is similar to the earlier resolution steps. This commit resolves npm module imports to the CDN. It does this by fetching the `package.json` and reading it to work out where teh entry point is. This enables `import x from 'any-random-package';`.
129 |
130 | Unlike with the svelte packages, where we can easily workout what the structure looks like, the entrypoint for a given npm module can vary significantly. We just get the `package.json` to remove any ambiguity.
131 |
132 | This also works for Svelte-specific packages that are using the `svelte` field to point to uncompile `.svelte` files.
133 |
134 | [Browse the repo at this point](https://github.com/pngwn/REPLicant/tree/adc1028989503ace1cac410df2b5cfbc4b46f488)\
135 | [View the diff](https://github.com/pngwn/REPLicant/commit/adc1028989503ace1cac410df2b5cfbc4b46f488)
136 |
137 | ## What next?
138 |
139 | This is just the start, from here you can go on to add whatever features you like.
140 |
141 | Maybe you want allow importing different file types, that would just require a new transform that convert that format into JavaScript, just like we did with `.svelte` files.
142 |
143 | Perhaps you'd like to add additional UI features. Draggable tabs, more user feedback. Syntax highlighting and code completion could be added by using a dedicated code editor such as [monaco-editor](https://microsoft.github.io/monaco-editor/) or [codemirror](https://codemirror.net/)(which is used by the official Svelte REPL).
144 |
145 | Maybe you want to improve the performance of the data-loading and compilation by adding some caching for those behaviours inside the web worker.
146 |
147 | The list is endless, check the [repl on the Svelte site](https://svelte.dev/repl/) for inspiration but don't let that limit you!
148 |
149 | ## Further reading
150 |
151 | - To understand the Svelte API itself - [tutorial](https://svelte.dev/tutorial/) - [docs](https://svelte.dev/docs/)
152 | - [Svelte REPL](https://svelte.dev/repl/)
153 | - [mdsvex Playground](https://mdsvex.com/playground)
154 | - [Try Ruby](https://try.ruby-lang.org/)
155 | - [Tour of Go](https://tour.golang.org/welcome/1)
156 | - [Rust Playground](https://play.rust-lang.org/)
157 | - [TypesScript Playground](https://www.typescriptlang.org/play)
158 | - [Web Workers](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers)
159 | - [Blobs](https://developer.mozilla.org/en-US/docs/Web/API/Blob)
160 | - [Blob URLS](https://javascript.info/blob)
161 | - [Embedding content and iFrames](https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Other_embedding_technologies)
162 | - [Communicating with iFrames](https://javascript.info/cross-window-communication)
163 |
164 | ## Questions
165 |
166 | If you have questions or feedback then feel to file an issue here, bug me on twitter ([@evilpingwin](https://twitter.com/evilpingwin)), or you can grab me on discord (@pngwn).
167 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | dependencies:
2 | sirv-cli: 1.0.6
3 | devDependencies:
4 | '@rollup/plugin-commonjs': 14.0.0_rollup@2.29.0
5 | '@rollup/plugin-node-resolve': 8.4.0_rollup@2.29.0
6 | '@rollup/plugin-typescript': 6.0.0_3cf0551218068091b4bd1b4d46e0396b
7 | '@tsconfig/svelte': 1.0.10
8 | rollup: 2.29.0
9 | rollup-plugin-livereload: 2.0.0
10 | rollup-plugin-svelte: 6.0.1_rollup@2.29.0+svelte@3.29.0
11 | rollup-plugin-terser: 7.0.2_rollup@2.29.0
12 | svelte: 3.29.0
13 | svelte-check: 1.0.55
14 | svelte-preprocess: 4.5.1_svelte@3.29.0+typescript@3.9.7
15 | tslib: 2.0.3
16 | typescript: 3.9.7
17 | lockfileVersion: 5.1
18 | packages:
19 | /@babel/code-frame/7.10.4:
20 | dependencies:
21 | '@babel/highlight': 7.10.4
22 | dev: true
23 | resolution:
24 | integrity: sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
25 | /@babel/helper-validator-identifier/7.10.4:
26 | dev: true
27 | resolution:
28 | integrity: sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==
29 | /@babel/highlight/7.10.4:
30 | dependencies:
31 | '@babel/helper-validator-identifier': 7.10.4
32 | chalk: 2.4.2
33 | js-tokens: 4.0.0
34 | dev: true
35 | resolution:
36 | integrity: sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==
37 | /@emmetio/extract-abbreviation/0.1.6:
38 | dev: true
39 | resolution:
40 | integrity: sha512-Ce3xE2JvTSEbASFbRbA1gAIcMcZWdS2yUYRaQbeM0nbOzaZrUYfa3ePtcriYRZOZmr+CkKA+zbjhvTpIOAYVcw==
41 | /@polka/url/1.0.0-next.11:
42 | dev: false
43 | resolution:
44 | integrity: sha512-3NsZsJIA/22P3QUyrEDNA2D133H4j224twJrdipXN38dpnIOzAbUDtOwkcJ5pXmn75w7LSQDjA4tO9dm1XlqlA==
45 | /@rollup/plugin-commonjs/14.0.0_rollup@2.29.0:
46 | dependencies:
47 | '@rollup/pluginutils': 3.1.0_rollup@2.29.0
48 | commondir: 1.0.1
49 | estree-walker: 1.0.1
50 | glob: 7.1.6
51 | is-reference: 1.2.1
52 | magic-string: 0.25.7
53 | resolve: 1.17.0
54 | rollup: 2.29.0
55 | dev: true
56 | engines:
57 | node: '>= 8.0.0'
58 | peerDependencies:
59 | rollup: ^2.3.4
60 | resolution:
61 | integrity: sha512-+PSmD9ePwTAeU106i9FRdc+Zb3XUWyW26mo5Atr2mk82hor8+nPwkztEjFo8/B1fJKfaQDg9aM2bzQkjhi7zOw==
62 | /@rollup/plugin-node-resolve/8.4.0_rollup@2.29.0:
63 | dependencies:
64 | '@rollup/pluginutils': 3.1.0_rollup@2.29.0
65 | '@types/resolve': 1.17.1
66 | builtin-modules: 3.1.0
67 | deep-freeze: 0.0.1
68 | deepmerge: 4.2.2
69 | is-module: 1.0.0
70 | resolve: 1.17.0
71 | rollup: 2.29.0
72 | dev: true
73 | engines:
74 | node: '>= 8.0.0'
75 | peerDependencies:
76 | rollup: ^1.20.0||^2.0.0
77 | resolution:
78 | integrity: sha512-LFqKdRLn0ShtQyf6SBYO69bGE1upV6wUhBX0vFOUnLAyzx5cwp8svA0eHUnu8+YU57XOkrMtfG63QOpQx25pHQ==
79 | /@rollup/plugin-typescript/6.0.0_3cf0551218068091b4bd1b4d46e0396b:
80 | dependencies:
81 | '@rollup/pluginutils': 3.1.0_rollup@2.29.0
82 | resolve: 1.17.0
83 | rollup: 2.29.0
84 | tslib: 2.0.3
85 | typescript: 3.9.7
86 | dev: true
87 | engines:
88 | node: '>=8.0.0'
89 | peerDependencies:
90 | rollup: ^2.14.0
91 | tslib: '*'
92 | typescript: '>=3.4.0'
93 | resolution:
94 | integrity: sha512-Y5U2L4eaF3wUSgCZRMdvNmuzWkKMyN3OwvhAdbzAi5sUqedaBk/XbzO4T7RlViDJ78MOPhwAIv2FtId/jhMtbg==
95 | /@rollup/pluginutils/3.1.0_rollup@2.29.0:
96 | dependencies:
97 | '@types/estree': 0.0.39
98 | estree-walker: 1.0.1
99 | picomatch: 2.2.2
100 | rollup: 2.29.0
101 | dev: true
102 | engines:
103 | node: '>= 8.0.0'
104 | peerDependencies:
105 | rollup: ^1.20.0||^2.0.0
106 | resolution:
107 | integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==
108 | /@tsconfig/svelte/1.0.10:
109 | dev: true
110 | resolution:
111 | integrity: sha512-EBrpH2iXXfaf/9z81koiDYkp2mlwW2XzFcAqn6qh7VKyP8zBvHHAQzNhY+W9vH5arAjmGAm5g8ElWq6YmXm3ig==
112 | /@types/estree/0.0.39:
113 | dev: true
114 | resolution:
115 | integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==
116 | /@types/estree/0.0.45:
117 | dev: true
118 | resolution:
119 | integrity: sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==
120 | /@types/node/14.11.8:
121 | dev: true
122 | resolution:
123 | integrity: sha512-KPcKqKm5UKDkaYPTuXSx8wEP7vE9GnuaXIZKijwRYcePpZFDVuy2a57LarFKiORbHOuTOOwYzxVxcUzsh2P2Pw==
124 | /@types/parse-json/4.0.0:
125 | dev: true
126 | resolution:
127 | integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
128 | /@types/pug/2.0.4:
129 | dev: true
130 | resolution:
131 | integrity: sha1-h3L80EGOPNLMFxVV1zAHQVBR9LI=
132 | /@types/resolve/1.17.1:
133 | dependencies:
134 | '@types/node': 14.11.8
135 | dev: true
136 | resolution:
137 | integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==
138 | /@types/sass/1.16.0:
139 | dependencies:
140 | '@types/node': 14.11.8
141 | dev: true
142 | resolution:
143 | integrity: sha512-2XZovu4NwcqmtZtsBR5XYLw18T8cBCnU2USFHTnYLLHz9fkhnoEMoDsqShJIOFsFhn5aJHjweiUUdTrDGujegA==
144 | /ansi-styles/3.2.1:
145 | dependencies:
146 | color-convert: 1.9.3
147 | dev: true
148 | engines:
149 | node: '>=4'
150 | resolution:
151 | integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
152 | /ansi-styles/4.3.0:
153 | dependencies:
154 | color-convert: 2.0.1
155 | dev: true
156 | engines:
157 | node: '>=8'
158 | resolution:
159 | integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
160 | /anymatch/3.1.1:
161 | dependencies:
162 | normalize-path: 3.0.0
163 | picomatch: 2.2.2
164 | dev: true
165 | engines:
166 | node: '>= 8'
167 | resolution:
168 | integrity: sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
169 | /async-limiter/1.0.1:
170 | dev: true
171 | resolution:
172 | integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
173 | /balanced-match/1.0.0:
174 | dev: true
175 | resolution:
176 | integrity: sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
177 | /binary-extensions/2.1.0:
178 | dev: true
179 | engines:
180 | node: '>=8'
181 | resolution:
182 | integrity: sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==
183 | /brace-expansion/1.1.11:
184 | dependencies:
185 | balanced-match: 1.0.0
186 | concat-map: 0.0.1
187 | dev: true
188 | resolution:
189 | integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
190 | /braces/3.0.2:
191 | dependencies:
192 | fill-range: 7.0.1
193 | dev: true
194 | engines:
195 | node: '>=8'
196 | resolution:
197 | integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
198 | /buffer-from/1.1.1:
199 | dev: true
200 | resolution:
201 | integrity: sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
202 | /builtin-modules/3.1.0:
203 | dev: true
204 | engines:
205 | node: '>=6'
206 | resolution:
207 | integrity: sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==
208 | /callsites/3.1.0:
209 | dev: true
210 | engines:
211 | node: '>=6'
212 | resolution:
213 | integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
214 | /chalk/2.4.2:
215 | dependencies:
216 | ansi-styles: 3.2.1
217 | escape-string-regexp: 1.0.5
218 | supports-color: 5.5.0
219 | dev: true
220 | engines:
221 | node: '>=4'
222 | resolution:
223 | integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
224 | /chalk/4.1.0:
225 | dependencies:
226 | ansi-styles: 4.3.0
227 | supports-color: 7.2.0
228 | dev: true
229 | engines:
230 | node: '>=10'
231 | resolution:
232 | integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
233 | /chokidar/3.4.2:
234 | dependencies:
235 | anymatch: 3.1.1
236 | braces: 3.0.2
237 | glob-parent: 5.1.1
238 | is-binary-path: 2.1.0
239 | is-glob: 4.0.1
240 | normalize-path: 3.0.0
241 | readdirp: 3.4.0
242 | dev: true
243 | engines:
244 | node: '>= 8.10.0'
245 | optionalDependencies:
246 | fsevents: 2.1.3
247 | resolution:
248 | integrity: sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==
249 | /color-convert/1.9.3:
250 | dependencies:
251 | color-name: 1.1.3
252 | dev: true
253 | resolution:
254 | integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
255 | /color-convert/2.0.1:
256 | dependencies:
257 | color-name: 1.1.4
258 | dev: true
259 | engines:
260 | node: '>=7.0.0'
261 | resolution:
262 | integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
263 | /color-name/1.1.3:
264 | dev: true
265 | resolution:
266 | integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
267 | /color-name/1.1.4:
268 | dev: true
269 | resolution:
270 | integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
271 | /commander/2.20.3:
272 | dev: true
273 | resolution:
274 | integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
275 | /commondir/1.0.1:
276 | dev: true
277 | resolution:
278 | integrity: sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
279 | /concat-map/0.0.1:
280 | dev: true
281 | resolution:
282 | integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
283 | /console-clear/1.1.1:
284 | dev: false
285 | engines:
286 | node: '>=4'
287 | resolution:
288 | integrity: sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==
289 | /cosmiconfig/7.0.0:
290 | dependencies:
291 | '@types/parse-json': 4.0.0
292 | import-fresh: 3.2.1
293 | parse-json: 5.1.0
294 | path-type: 4.0.0
295 | yaml: 1.10.0
296 | dev: true
297 | engines:
298 | node: '>=10'
299 | resolution:
300 | integrity: sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==
301 | /dedent-js/1.0.1:
302 | dev: true
303 | resolution:
304 | integrity: sha1-vuX7fJ5yfYXf+iRZDRDsGrElUwU=
305 | /deep-freeze/0.0.1:
306 | dev: true
307 | resolution:
308 | integrity: sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ=
309 | /deepmerge/4.2.2:
310 | dev: true
311 | engines:
312 | node: '>=0.10.0'
313 | resolution:
314 | integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
315 | /detect-indent/6.0.0:
316 | dev: true
317 | engines:
318 | node: '>=8'
319 | resolution:
320 | integrity: sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==
321 | /error-ex/1.3.2:
322 | dependencies:
323 | is-arrayish: 0.2.1
324 | dev: true
325 | resolution:
326 | integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
327 | /escape-string-regexp/1.0.5:
328 | dev: true
329 | engines:
330 | node: '>=0.8.0'
331 | resolution:
332 | integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
333 | /estree-walker/0.6.1:
334 | dev: true
335 | resolution:
336 | integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==
337 | /estree-walker/1.0.1:
338 | dev: true
339 | resolution:
340 | integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==
341 | /estree-walker/2.0.1:
342 | dev: true
343 | resolution:
344 | integrity: sha512-tF0hv+Yi2Ot1cwj9eYHtxC0jB9bmjacjQs6ZBTj82H8JwUywFuc+7E83NWfNMwHXZc11mjfFcVXPe9gEP4B8dg==
345 | /fill-range/7.0.1:
346 | dependencies:
347 | to-regex-range: 5.0.1
348 | dev: true
349 | engines:
350 | node: '>=8'
351 | resolution:
352 | integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
353 | /fs.realpath/1.0.0:
354 | dev: true
355 | resolution:
356 | integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
357 | /fsevents/2.1.3:
358 | dev: true
359 | engines:
360 | node: ^8.16.0 || ^10.6.0 || >=11.0.0
361 | optional: true
362 | os:
363 | - darwin
364 | resolution:
365 | integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
366 | /get-port/3.2.0:
367 | dev: false
368 | engines:
369 | node: '>=4'
370 | resolution:
371 | integrity: sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=
372 | /glob-parent/5.1.1:
373 | dependencies:
374 | is-glob: 4.0.1
375 | dev: true
376 | engines:
377 | node: '>= 6'
378 | resolution:
379 | integrity: sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
380 | /glob/7.1.6:
381 | dependencies:
382 | fs.realpath: 1.0.0
383 | inflight: 1.0.6
384 | inherits: 2.0.4
385 | minimatch: 3.0.4
386 | once: 1.4.0
387 | path-is-absolute: 1.0.1
388 | dev: true
389 | resolution:
390 | integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
391 | /has-flag/3.0.0:
392 | dev: true
393 | engines:
394 | node: '>=4'
395 | resolution:
396 | integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
397 | /has-flag/4.0.0:
398 | dev: true
399 | engines:
400 | node: '>=8'
401 | resolution:
402 | integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
403 | /import-fresh/3.2.1:
404 | dependencies:
405 | parent-module: 1.0.1
406 | resolve-from: 4.0.0
407 | dev: true
408 | engines:
409 | node: '>=6'
410 | resolution:
411 | integrity: sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==
412 | /inflight/1.0.6:
413 | dependencies:
414 | once: 1.4.0
415 | wrappy: 1.0.2
416 | dev: true
417 | resolution:
418 | integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
419 | /inherits/2.0.4:
420 | dev: true
421 | resolution:
422 | integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
423 | /is-arrayish/0.2.1:
424 | dev: true
425 | resolution:
426 | integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
427 | /is-binary-path/2.1.0:
428 | dependencies:
429 | binary-extensions: 2.1.0
430 | dev: true
431 | engines:
432 | node: '>=8'
433 | resolution:
434 | integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
435 | /is-extglob/2.1.1:
436 | dev: true
437 | engines:
438 | node: '>=0.10.0'
439 | resolution:
440 | integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
441 | /is-glob/4.0.1:
442 | dependencies:
443 | is-extglob: 2.1.1
444 | dev: true
445 | engines:
446 | node: '>=0.10.0'
447 | resolution:
448 | integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
449 | /is-module/1.0.0:
450 | dev: true
451 | resolution:
452 | integrity: sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=
453 | /is-number/7.0.0:
454 | dev: true
455 | engines:
456 | node: '>=0.12.0'
457 | resolution:
458 | integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
459 | /is-reference/1.2.1:
460 | dependencies:
461 | '@types/estree': 0.0.45
462 | dev: true
463 | resolution:
464 | integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==
465 | /jest-worker/26.5.0:
466 | dependencies:
467 | '@types/node': 14.11.8
468 | merge-stream: 2.0.0
469 | supports-color: 7.2.0
470 | dev: true
471 | engines:
472 | node: '>= 10.13.0'
473 | resolution:
474 | integrity: sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==
475 | /js-tokens/4.0.0:
476 | dev: true
477 | resolution:
478 | integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
479 | /json-parse-even-better-errors/2.3.1:
480 | dev: true
481 | resolution:
482 | integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
483 | /jsonc-parser/1.0.3:
484 | dev: true
485 | resolution:
486 | integrity: sha512-hk/69oAeaIzchq/v3lS50PXuzn5O2ynldopMC+SWBql7J2WtdptfB9dy8Y7+Og5rPkTCpn83zTiO8FMcqlXJ/g==
487 | /kleur/3.0.3:
488 | dev: false
489 | engines:
490 | node: '>=6'
491 | resolution:
492 | integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
493 | /lines-and-columns/1.1.6:
494 | dev: true
495 | resolution:
496 | integrity: sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
497 | /livereload-js/3.3.1:
498 | dev: true
499 | resolution:
500 | integrity: sha512-CBu1gTEfzVhlOK1WASKAAJ9Qx1fHECTq0SUB67sfxwQssopTyvzqTlgl+c0h9pZ6V+Fzd2rc510ppuNusg9teQ==
501 | /livereload/0.9.1:
502 | dependencies:
503 | chokidar: 3.4.2
504 | livereload-js: 3.3.1
505 | opts: 2.0.2
506 | ws: 6.2.1
507 | dev: true
508 | engines:
509 | node: '>=8.0.0'
510 | hasBin: true
511 | resolution:
512 | integrity: sha512-9g7sua11kkyZNo2hLRCG3LuZZwqexoyEyecSlV8cAsfAVVCZqLzVir6XDqmH0r+Vzgnd5LrdHDMyjtFnJQLAYw==
513 | /local-access/1.0.1:
514 | dev: false
515 | engines:
516 | node: '>=6'
517 | resolution:
518 | integrity: sha512-ykt2pgN0aqIy6KQC1CqdWTWkmUwNgaOS6dcpHVjyBJONA+Xi7AtSB1vuxC/U/0tjIP3wcRudwQk1YYzUvzk2bA==
519 | /lodash/4.17.20:
520 | dev: true
521 | resolution:
522 | integrity: sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
523 | /lower-case/2.0.1:
524 | dependencies:
525 | tslib: 1.14.1
526 | dev: true
527 | resolution:
528 | integrity: sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==
529 | /magic-string/0.25.7:
530 | dependencies:
531 | sourcemap-codec: 1.4.8
532 | dev: true
533 | resolution:
534 | integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==
535 | /merge-stream/2.0.0:
536 | dev: true
537 | resolution:
538 | integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
539 | /mime/2.4.6:
540 | dev: false
541 | engines:
542 | node: '>=4.0.0'
543 | hasBin: true
544 | resolution:
545 | integrity: sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==
546 | /min-indent/1.0.1:
547 | dev: true
548 | engines:
549 | node: '>=4'
550 | resolution:
551 | integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
552 | /minimatch/3.0.4:
553 | dependencies:
554 | brace-expansion: 1.1.11
555 | dev: true
556 | resolution:
557 | integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
558 | /minimist/1.2.5:
559 | dev: true
560 | resolution:
561 | integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
562 | /mri/1.1.6:
563 | dev: false
564 | engines:
565 | node: '>=4'
566 | resolution:
567 | integrity: sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==
568 | /no-case/3.0.3:
569 | dependencies:
570 | lower-case: 2.0.1
571 | tslib: 1.14.1
572 | dev: true
573 | resolution:
574 | integrity: sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==
575 | /normalize-path/3.0.0:
576 | dev: true
577 | engines:
578 | node: '>=0.10.0'
579 | resolution:
580 | integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
581 | /once/1.4.0:
582 | dependencies:
583 | wrappy: 1.0.2
584 | dev: true
585 | resolution:
586 | integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
587 | /opts/2.0.2:
588 | dev: true
589 | resolution:
590 | integrity: sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==
591 | /parent-module/1.0.1:
592 | dependencies:
593 | callsites: 3.1.0
594 | dev: true
595 | engines:
596 | node: '>=6'
597 | resolution:
598 | integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
599 | /parse-json/5.1.0:
600 | dependencies:
601 | '@babel/code-frame': 7.10.4
602 | error-ex: 1.3.2
603 | json-parse-even-better-errors: 2.3.1
604 | lines-and-columns: 1.1.6
605 | dev: true
606 | engines:
607 | node: '>=8'
608 | resolution:
609 | integrity: sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==
610 | /pascal-case/3.1.1:
611 | dependencies:
612 | no-case: 3.0.3
613 | tslib: 1.14.1
614 | dev: true
615 | resolution:
616 | integrity: sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==
617 | /path-is-absolute/1.0.1:
618 | dev: true
619 | engines:
620 | node: '>=0.10.0'
621 | resolution:
622 | integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
623 | /path-parse/1.0.6:
624 | dev: true
625 | resolution:
626 | integrity: sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
627 | /path-type/4.0.0:
628 | dev: true
629 | engines:
630 | node: '>=8'
631 | resolution:
632 | integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
633 | /picomatch/2.2.2:
634 | dev: true
635 | engines:
636 | node: '>=8.6'
637 | resolution:
638 | integrity: sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
639 | /prettier-plugin-svelte/1.4.0_prettier@2.1.2+svelte@3.28.0:
640 | dependencies:
641 | prettier: 2.1.2
642 | svelte: 3.28.0
643 | dev: true
644 | peerDependencies:
645 | prettier: ^1.16.4 || ^2.0.0
646 | svelte: ^3.2.0
647 | resolution:
648 | integrity: sha512-KXO2He7Kql0Lz4DdlzVli1j2JTDUR9jPV/DqyfnJmY1pCeSV1qZkxgdsyYma35W6OLrCAr/G6yKdmzo+75u2Ng==
649 | /prettier/2.1.2:
650 | dev: true
651 | engines:
652 | node: '>=10.13.0'
653 | hasBin: true
654 | resolution:
655 | integrity: sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==
656 | /randombytes/2.1.0:
657 | dependencies:
658 | safe-buffer: 5.2.1
659 | dev: true
660 | resolution:
661 | integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
662 | /readdirp/3.4.0:
663 | dependencies:
664 | picomatch: 2.2.2
665 | dev: true
666 | engines:
667 | node: '>=8.10.0'
668 | resolution:
669 | integrity: sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==
670 | /require-relative/0.8.7:
671 | dev: true
672 | resolution:
673 | integrity: sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=
674 | /resolve-from/4.0.0:
675 | dev: true
676 | engines:
677 | node: '>=4'
678 | resolution:
679 | integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
680 | /resolve/1.17.0:
681 | dependencies:
682 | path-parse: 1.0.6
683 | dev: true
684 | resolution:
685 | integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
686 | /rollup-plugin-livereload/2.0.0:
687 | dependencies:
688 | livereload: 0.9.1
689 | dev: true
690 | engines:
691 | node: '>=8.3'
692 | resolution:
693 | integrity: sha512-oC/8NqumGYuphkqrfszOHUUIwzKsaHBICw6QRwT5uD07gvePTS+HW+GFwu6f9K8W02CUuTvtIM9AWJrbj4wE1A==
694 | /rollup-plugin-svelte/6.0.1_rollup@2.29.0+svelte@3.29.0:
695 | dependencies:
696 | require-relative: 0.8.7
697 | rollup: 2.29.0
698 | rollup-pluginutils: 2.8.2
699 | sourcemap-codec: 1.4.8
700 | svelte: 3.29.0
701 | dev: true
702 | peerDependencies:
703 | rollup: '>=1.19.2'
704 | svelte: '*'
705 | resolution:
706 | integrity: sha512-kS9/JZMBNgpKTqVKlwV8mhmGwxu8NiNf6+n5ZzdZ8yDp3+ADqjf8Au+JNEpoOn6kLlh1hLS2Gsa76k9RP57HDQ==
707 | /rollup-plugin-terser/7.0.2_rollup@2.29.0:
708 | dependencies:
709 | '@babel/code-frame': 7.10.4
710 | jest-worker: 26.5.0
711 | rollup: 2.29.0
712 | serialize-javascript: 4.0.0
713 | terser: 5.3.4
714 | dev: true
715 | peerDependencies:
716 | rollup: ^2.0.0
717 | resolution:
718 | integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==
719 | /rollup-pluginutils/2.8.2:
720 | dependencies:
721 | estree-walker: 0.6.1
722 | dev: true
723 | resolution:
724 | integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==
725 | /rollup/2.29.0:
726 | dev: true
727 | engines:
728 | node: '>=10.0.0'
729 | hasBin: true
730 | optionalDependencies:
731 | fsevents: 2.1.3
732 | resolution:
733 | integrity: sha512-gtU0sjxMpsVlpuAf4QXienPmUAhd6Kc7owQ4f5lypoxBW18fw2UNYZ4NssLGsri6WhUZkE/Ts3EMRebN+gNLiQ==
734 | /sade/1.7.4:
735 | dependencies:
736 | mri: 1.1.6
737 | dev: false
738 | engines:
739 | node: '>= 6'
740 | resolution:
741 | integrity: sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==
742 | /safe-buffer/5.2.1:
743 | dev: true
744 | resolution:
745 | integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
746 | /semiver/1.1.0:
747 | dev: false
748 | engines:
749 | node: '>=6'
750 | resolution:
751 | integrity: sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==
752 | /serialize-javascript/4.0.0:
753 | dependencies:
754 | randombytes: 2.1.0
755 | dev: true
756 | resolution:
757 | integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==
758 | /sirv-cli/1.0.6:
759 | dependencies:
760 | console-clear: 1.1.1
761 | get-port: 3.2.0
762 | kleur: 3.0.3
763 | local-access: 1.0.1
764 | sade: 1.7.4
765 | semiver: 1.1.0
766 | sirv: 1.0.6
767 | tinydate: 1.3.0
768 | dev: false
769 | engines:
770 | node: '>= 10'
771 | hasBin: true
772 | resolution:
773 | integrity: sha512-K/iY1OHG7hTw4GzLoqMhwzKCbgWmx5joYAAF2+CwyiamWCpVzAgNVWgAc0JmSA2Gf3wseov05il2QbFTGTZMVg==
774 | /sirv/1.0.6:
775 | dependencies:
776 | '@polka/url': 1.0.0-next.11
777 | mime: 2.4.6
778 | totalist: 1.1.0
779 | dev: false
780 | engines:
781 | node: '>= 10'
782 | resolution:
783 | integrity: sha512-LRGu7Op4Xl9hhigOy2kcB53zAYTjNDdpooey49dIU0cMdpOv9ithVf7nstk3jvs8EhMiT/VORoyazZYGgw4vnA==
784 | /source-map-support/0.5.19:
785 | dependencies:
786 | buffer-from: 1.1.1
787 | source-map: 0.6.1
788 | dev: true
789 | resolution:
790 | integrity: sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
791 | /source-map/0.6.1:
792 | dev: true
793 | engines:
794 | node: '>=0.10.0'
795 | resolution:
796 | integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
797 | /source-map/0.7.3:
798 | dev: true
799 | engines:
800 | node: '>= 8'
801 | resolution:
802 | integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
803 | /sourcemap-codec/1.4.8:
804 | dev: true
805 | resolution:
806 | integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
807 | /strip-indent/3.0.0:
808 | dependencies:
809 | min-indent: 1.0.1
810 | dev: true
811 | engines:
812 | node: '>=8'
813 | resolution:
814 | integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
815 | /supports-color/5.5.0:
816 | dependencies:
817 | has-flag: 3.0.0
818 | dev: true
819 | engines:
820 | node: '>=4'
821 | resolution:
822 | integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
823 | /supports-color/7.2.0:
824 | dependencies:
825 | has-flag: 4.0.0
826 | dev: true
827 | engines:
828 | node: '>=8'
829 | resolution:
830 | integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
831 | /svelte-check/1.0.55:
832 | dependencies:
833 | chalk: 4.1.0
834 | chokidar: 3.4.2
835 | glob: 7.1.6
836 | minimist: 1.2.5
837 | svelte-language-server: 0.10.134
838 | vscode-languageserver: 6.1.1
839 | vscode-languageserver-protocol: 3.15.3
840 | vscode-languageserver-types: 3.15.1
841 | vscode-uri: 2.1.2
842 | dev: true
843 | hasBin: true
844 | resolution:
845 | integrity: sha512-CEN9h7eXvReXhS9ebxtQDZ4WjwKaqBmM3hY9HEsEHy88Zy9aZ7kASSF2Zy9YTNM86Z/r7mf2X6Mcxp0tyoDmLw==
846 | /svelte-language-server/0.10.134:
847 | dependencies:
848 | chokidar: 3.4.2
849 | cosmiconfig: 7.0.0
850 | estree-walker: 2.0.1
851 | lodash: 4.17.20
852 | prettier: 2.1.2
853 | prettier-plugin-svelte: 1.4.0_prettier@2.1.2+svelte@3.28.0
854 | source-map: 0.7.3
855 | svelte: 3.28.0
856 | svelte-preprocess: 4.3.2_svelte@3.28.0+typescript@3.9.7
857 | svelte2tsx: 0.1.122_svelte@3.28.0+typescript@3.9.7
858 | typescript: 3.9.7
859 | vscode-css-languageservice: 4.2.0
860 | vscode-emmet-helper: 1.2.17
861 | vscode-html-languageservice: 3.0.4-next.15
862 | vscode-languageserver: 6.1.1
863 | vscode-languageserver-types: 3.15.1
864 | vscode-uri: 2.1.2
865 | dev: true
866 | hasBin: true
867 | resolution:
868 | integrity: sha512-75fBs6c5aT+wFA/l0XG9a9ax2QrV7rrO/+4idw2OCFkgsQoK4RAp9i+vP9JNYnIcm4eM2bm/a6bcBxfwkifzHA==
869 | /svelte-preprocess/4.3.2_svelte@3.28.0+typescript@3.9.7:
870 | dependencies:
871 | '@types/pug': 2.0.4
872 | '@types/sass': 1.16.0
873 | detect-indent: 6.0.0
874 | strip-indent: 3.0.0
875 | svelte: 3.28.0
876 | typescript: 3.9.7
877 | dev: true
878 | engines:
879 | node: '>= 9.11.2'
880 | peerDependencies:
881 | '@babel/core': ^7.10.2
882 | coffeescript: ^2.5.1
883 | less: ^3.11.3
884 | node-sass: '*'
885 | postcss: ^7.0.32
886 | postcss-load-config: ^2.1.0
887 | pug: ^3.0.0
888 | sass: ^1.26.8
889 | stylus: ^0.54.7
890 | svelte: ^3.23.0
891 | typescript: ^3.9.5 || ^4.0.0
892 | peerDependenciesMeta:
893 | '@babel/core':
894 | optional: true
895 | coffeescript:
896 | optional: true
897 | less:
898 | optional: true
899 | node-sass:
900 | optional: true
901 | postcss:
902 | optional: true
903 | postcss-load-config:
904 | optional: true
905 | pug:
906 | optional: true
907 | sass:
908 | optional: true
909 | stylus:
910 | optional: true
911 | svelte:
912 | optional: true
913 | typescript:
914 | optional: true
915 | requiresBuild: true
916 | resolution:
917 | integrity: sha512-CmIsCr62y34qGS10/SC1l1VkmX0kZR6wncbGgRJ1qJftLDMEaazC3bWqoqAlrqyQFvpO0+xb44GQm4RKi/9sLQ==
918 | /svelte-preprocess/4.5.1_svelte@3.29.0+typescript@3.9.7:
919 | dependencies:
920 | '@types/pug': 2.0.4
921 | '@types/sass': 1.16.0
922 | detect-indent: 6.0.0
923 | strip-indent: 3.0.0
924 | svelte: 3.29.0
925 | typescript: 3.9.7
926 | dev: true
927 | engines:
928 | node: '>= 9.11.2'
929 | peerDependencies:
930 | '@babel/core': ^7.10.2
931 | coffeescript: ^2.5.1
932 | less: ^3.11.3
933 | node-sass: '*'
934 | postcss: ^7 || ^8
935 | postcss-load-config: ^2.1.0
936 | pug: ^3.0.0
937 | sass: ^1.26.8
938 | stylus: ^0.54.7
939 | sugarss: ^2.0.0
940 | svelte: ^3.23.0
941 | typescript: ^3.9.5 || ^4.0.0
942 | peerDependenciesMeta:
943 | '@babel/core':
944 | optional: true
945 | coffeescript:
946 | optional: true
947 | less:
948 | optional: true
949 | node-sass:
950 | optional: true
951 | postcss:
952 | optional: true
953 | postcss-load-config:
954 | optional: true
955 | pug:
956 | optional: true
957 | sass:
958 | optional: true
959 | stylus:
960 | optional: true
961 | sugarss:
962 | optional: true
963 | svelte:
964 | optional: true
965 | typescript:
966 | optional: true
967 | requiresBuild: true
968 | resolution:
969 | integrity: sha512-fZiLMg+mJzp5y4bsvBtl6wE1WCp+s5L87BoKMONGLXk8HSZD5HuRJzxhM0yhM9LHF0jP5kYG22P2Vc/vrv4I0A==
970 | /svelte/3.28.0:
971 | dev: true
972 | engines:
973 | node: '>= 8'
974 | resolution:
975 | integrity: sha512-WJW8wD+aTmU5GUnTUjdhVF35mve2MjylubLgB6fGWoXHpYENdwcwWsWvjMQLayzMynqNH733h1Ck8wJzNR7gdQ==
976 | /svelte/3.29.0:
977 | dev: true
978 | engines:
979 | node: '>= 8'
980 | resolution:
981 | integrity: sha512-f+A65eyOQ5ujETLy+igNXtlr6AEjAQLYd1yJE1VwNiXMQO5Z/Vmiy3rL+zblV/9jd7rtTTWqO1IcuXsP2Qv0OA==
982 | /svelte2tsx/0.1.122_svelte@3.28.0+typescript@3.9.7:
983 | dependencies:
984 | dedent-js: 1.0.1
985 | pascal-case: 3.1.1
986 | svelte: 3.28.0
987 | typescript: 3.9.7
988 | dev: true
989 | peerDependencies:
990 | svelte: ^3.24
991 | typescript: ^4.0.2
992 | resolution:
993 | integrity: sha512-5130S9oYXyg866/upHja1feBc+C7kMO/RkZE2U3/hf59ss56JjhtZrP+6Owap2gnueSs5MNVuQdkhBDIOjkMiw==
994 | /terser/5.3.4:
995 | dependencies:
996 | commander: 2.20.3
997 | source-map: 0.7.3
998 | source-map-support: 0.5.19
999 | dev: true
1000 | engines:
1001 | node: '>=6.0.0'
1002 | hasBin: true
1003 | resolution:
1004 | integrity: sha512-dxuB8KQo8Gt6OVOeLg/rxfcxdNZI/V1G6ze1czFUzPeCFWZRtvZMgSzlZZ5OYBZ4HoG607F6pFPNLekJyV+yVw==
1005 | /tinydate/1.3.0:
1006 | dev: false
1007 | engines:
1008 | node: '>=4'
1009 | resolution:
1010 | integrity: sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==
1011 | /to-regex-range/5.0.1:
1012 | dependencies:
1013 | is-number: 7.0.0
1014 | dev: true
1015 | engines:
1016 | node: '>=8.0'
1017 | resolution:
1018 | integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
1019 | /totalist/1.1.0:
1020 | dev: false
1021 | engines:
1022 | node: '>=6'
1023 | resolution:
1024 | integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==
1025 | /tslib/1.14.1:
1026 | dev: true
1027 | resolution:
1028 | integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
1029 | /tslib/2.0.3:
1030 | dev: true
1031 | resolution:
1032 | integrity: sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==
1033 | /typescript/3.9.7:
1034 | dev: true
1035 | engines:
1036 | node: '>=4.2.0'
1037 | hasBin: true
1038 | resolution:
1039 | integrity: sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==
1040 | /vscode-css-languageservice/4.2.0:
1041 | dependencies:
1042 | vscode-languageserver-textdocument: 1.0.1
1043 | vscode-languageserver-types: 3.15.1
1044 | vscode-nls: 4.1.2
1045 | vscode-uri: 2.1.2
1046 | dev: true
1047 | resolution:
1048 | integrity: sha512-HIjl5bofrrxMMF05K/nq83270EdvteuAIio44FWd6tDdfhgg4vbofiAuXRSpXFi335f5+ekKdrzvPZm9ahqzsg==
1049 | /vscode-emmet-helper/1.2.17:
1050 | dependencies:
1051 | '@emmetio/extract-abbreviation': 0.1.6
1052 | jsonc-parser: 1.0.3
1053 | vscode-languageserver-types: 3.15.1
1054 | dev: true
1055 | resolution:
1056 | integrity: sha512-X4pzcrJ8dE7M3ArFuySF5fgipKDd/EauXkiJwtjBIVRWpVNq0tF9+lNCyuC7iDUwP3Oq7ow/TGssD3GdG96Jow==
1057 | /vscode-html-languageservice/3.0.4-next.15:
1058 | dependencies:
1059 | vscode-languageserver-textdocument: 1.0.1
1060 | vscode-languageserver-types: 3.15.1
1061 | vscode-nls: 4.1.2
1062 | vscode-uri: 2.1.2
1063 | dev: true
1064 | resolution:
1065 | integrity: sha512-UmUm3A1ZTj+BloVIyel+5pK/nfsqRfPLXzl8BA9O7v5Cj64vivddABvNf/rW1US8fzdikFNZNloC/4ooqxB2kw==
1066 | /vscode-jsonrpc/5.0.1:
1067 | dev: true
1068 | engines:
1069 | node: '>=8.0.0 || >=10.0.0'
1070 | resolution:
1071 | integrity: sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A==
1072 | /vscode-languageserver-protocol/3.15.3:
1073 | dependencies:
1074 | vscode-jsonrpc: 5.0.1
1075 | vscode-languageserver-types: 3.15.1
1076 | dev: true
1077 | resolution:
1078 | integrity: sha512-zrMuwHOAQRhjDSnflWdJG+O2ztMWss8GqUUB8dXLR/FPenwkiBNkMIJJYfSN6sgskvsF0rHAoBowNQfbyZnnvw==
1079 | /vscode-languageserver-textdocument/1.0.1:
1080 | dev: true
1081 | resolution:
1082 | integrity: sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA==
1083 | /vscode-languageserver-types/3.15.1:
1084 | dev: true
1085 | resolution:
1086 | integrity: sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==
1087 | /vscode-languageserver/6.1.1:
1088 | dependencies:
1089 | vscode-languageserver-protocol: 3.15.3
1090 | dev: true
1091 | hasBin: true
1092 | resolution:
1093 | integrity: sha512-DueEpkUAkD5XTR4MLYNr6bQIp/UFR0/IPApgXU3YfCBCB08u2sm9hRCs6DxYZELkk++STPjpcjksR2H8qI3cDQ==
1094 | /vscode-nls/4.1.2:
1095 | dev: true
1096 | resolution:
1097 | integrity: sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw==
1098 | /vscode-uri/2.1.2:
1099 | dev: true
1100 | resolution:
1101 | integrity: sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==
1102 | /wrappy/1.0.2:
1103 | dev: true
1104 | resolution:
1105 | integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
1106 | /ws/6.2.1:
1107 | dependencies:
1108 | async-limiter: 1.0.1
1109 | dev: true
1110 | resolution:
1111 | integrity: sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==
1112 | /yaml/1.10.0:
1113 | dev: true
1114 | engines:
1115 | node: '>= 6'
1116 | resolution:
1117 | integrity: sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==
1118 | specifiers:
1119 | '@rollup/plugin-commonjs': ^14.0.0
1120 | '@rollup/plugin-node-resolve': ^8.0.0
1121 | '@rollup/plugin-typescript': ^6.0.0
1122 | '@tsconfig/svelte': ^1.0.0
1123 | rollup: ^2.3.4
1124 | rollup-plugin-livereload: ^2.0.0
1125 | rollup-plugin-svelte: ^6.0.0
1126 | rollup-plugin-terser: ^7.0.0
1127 | sirv-cli: ^1.0.0
1128 | svelte: ^3.0.0
1129 | svelte-check: ^1.0.0
1130 | svelte-preprocess: ^4.0.0
1131 | tslib: ^2.0.0
1132 | typescript: ^3.9.3
1133 |
--------------------------------------------------------------------------------